0

連絡先を追加/更新する方法はSaveです。私は非同期メソッドを設計しました。しかし、データベースからレコードを取得することはできません。AsyncがC#のエンティティフレームワークデータベースのプロセスメソッドを待機し続ける

が親切にコードを見てい:上記のコードで

public async Task<bool> SaveContact(Contact contact) 
{ 
    bool flag = false; 

    try 
    { 
     if(contact != null) 
     { 
      using(var dbContext = DBContext()) 
      { 
       ContactEDB contactObj = new ContactEDB(); 

       if(contact.Id > 0) 
       { 
        contactObj = await dbContext.Contact.FirstOrDefaultAsync(a => a.Id == contact.Id); 

        // The local variable "contactObj" always return NULL while on debugging 
        if(contactObj != null) 
        { 
         contactObj.FirstName = "John"; 
         contactObj.LastName = "Smith"; 
        } 
       } 
       else 
       { 
        contactObj = new contactObj() 
        { 
         FirstName = "John"; 
         LastName = "Smith"; 
        }; 

        dbContext.Contact.Add(contactObj); 
       } 

       dbContext.SaveChanges(); 
      } 
     } 
    } 
    catch(Exception ex) 
    { 
     // log error 
    } 

    return flag; 
} 

を、それは常に親切に私の要件を満たすために誰を支援

if(contactObj != null) 
{ 
     contactObj.FirstName = "John"; 
     contactObj.LastName = "Smith"; 
}; 

NULLを返します。

注:上記の方法はライブラリにあります。このメソッドを非同期で使用する方法を教えてください。上記符号化において

答えて

1

常に

NULLを返すこれは、データベース内contact.Id存在に等しいidの接触がないことを意味します。非同期メソッドを使用して非同期的にデータベースから結果を取得するかどうかは関係ありません。

あなたは一時的にテーブルからすべてのレコードを取得しようとすることができます:

var allContacts = await dbContext.Contact.ToListAsync(); 

...かわからデータベースに存在するために、あなたが知っているIDを指定しよう:

var contact = await dbContext.Contact.FirstOrDefaultAsync(a => a.Id == 1); 

使用上記の最初のコード行から返された連絡先のIDを確認し、2番目のクエリでこのIDを使用するようにデバッガを使用すると、contactObjオブジェクトが戻されます。

データベースに実際にレコードがいくつかあることを確認したら、SaveContactに渡すContactオブジェクトを調べて、データベースに存在するIDがない理由を調べることができます。あなたがデータベースに挿入する前に、たぶん、あなたはcontactObjのIdプロパティを設定する必要があります。

... 
      else 
      { 
       contactObj = new contactObj() 
       { 
        Id = 10, 
        FirstName = "John"; 
        LastName = "Smith"; 
       }; 

       dbContext.Contact.Add(contactObj); 
      } 

はまた、あなたがあなたのテーブルにオブジェクトの同じ種類を取得し、追加していることを確認してください。サンプルコードには、Contact、ContactEDB、およびcontactObjの3種類があります。たぶん1つだけにすべきです。

このメソッドを非同期で使用する方法を教えてください。

別に非同期のオーバーロードを使用してレコードをフェッチから、あなたも変更をperistするSaveChangesAsyncメソッドを使用する必要があります。https://msdn.microsoft.com/en-us/library/dn220070(v=vs.113).aspx

await dbContext.SaveChangesAsync(); 
+0

私は同期のアプローチを経由して同じコードを試してみました。それは正常に動作します... –

+0

あなたのコードに基づいて自分のコードを変更しています...お待ちください... –

関連する問題