[英]Async await and continuewith for a Entity Framework database Process Method in C#
我有一个Save
方法来添加/更新联系人。 我设计了一个异步方法。 但是我无法从数据库中获取记录。
请看一下代码:
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;
}
在上面的代码中,它总是返回NULL
if(contactObj != null)
{
contactObj.FirstName = "John";
contactObj.LastName = "Smith";
};
请协助我满足要求。
注意:所述方法在库中。 请协助我如何异步使用此方法。
在上面的编码中总是返回NULL
这意味着在数据库中不存在ID为contact.Id的联系人。 它是否与使用异步方法从数据库异步获取结果无关。
您可以临时尝试从表中获取所有记录:
var allContacts = await dbContext.Contact.ToListAsync();
...或尝试指定一个您肯定知道的数据库中存在的ID:
var contact = await dbContext.Contact.FirstOrDefaultAsync(a => a.Id == 1);
使用调试器确定从上面的第一行代码返回的任何联系人的ID,然后在第二个查询中使用此ID,您应该返回一个contactObj对象。
一旦确认您确实在数据库中有一些记录,就可以开始检查传递给SaveContact的Contact对象,并确定为什么它在数据库中没有ID。 也许应该在将contactObj插入数据库之前设置其Id属性:
...
else
{
contactObj = new contactObj()
{
Id = 10,
FirstName = "John";
LastName = "Smith";
};
dbContext.Contact.Add(contactObj);
}
还要确保获取并向表中添加相同类型的对象。 在您发布的示例代码中,涉及三种不同的类型,即Contact,ContactEDB和contactObj。 它可能应该只是一个。
请协助我如何异步使用此方法。
除了使用异步重载来获取记录外,还应该使用SaveChangesAsync方法来保留更改: https ://msdn.microsoft.com/zh-cn/library/dn220070(v = vs.113).aspx
await dbContext.SaveChangesAsync();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.