繁体   English   中英

C#中的Entity Framework数据库处理方法异步等待并继续

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM