【问题标题】:Async await and continuewith for a Entity Framework database Process Method in C#C# 中实体框架数据库处理方法的异步等待和继续
【发布时间】:2016-12-12 10:08:39
【问题描述】:

我有一个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";
};

请任何人帮助我满足要求。

注意:上述方法在库中。请帮助我如何使用异步使用此方法。

【问题讨论】:

    标签: c# entity-framework asynchronous async-await continuewith


    【解决方案1】:

    在上面的编码中总是返回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/en-us/library/dn220070(v=vs.113).aspx

    await dbContext.SaveChangesAsync();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      相关资源
      最近更新 更多