0

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

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

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

4

1 回答 1

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();
于 2016-12-12T10:52:18.457 回答