实体框架 - 更新或添加

时间:2016-03-24 15:14:28

标签: c# entity-framework

我想遍历一系列传入记录,检查我的数据库以查看它们是否已存在,并根据需要添加或更新它们。我收效甚微。

    var listOfClientAccounts = model.MTAccounts.ToList(); // single DB query
    // for each of the users MTManager
    foreach (var user in users)
    {
        var clientInDb = listOfClientAccounts
                             .SingleOrDefault(c => c.Login == user.Login); // runs in memory
        var processedUser = ProcessUserRecord(user);
        //Check if the Account Login is already in the database
        if (clientInDb != null)
        {
            processedUser.MTAccountId = clientInDb.MTAccountId;
            var entry = model.Entry(processedUser);
                            model.Entry(processedUser).CurrentValues.SetValues(processedUser);
            entry.State = EntityState.Modified;
            Console.WriteLine(x + " : UPDATE : " + processedUser.Login + "(" + clientInDb.MTAccountId + ")");
        }
        else
        {
            //  Client does not exist add now
            model.MTAccounts.Add(processedUser);
            Console.WriteLine(x + " : ADD :" + processedUser.Login);

        }
    }


 model.SaveChanges();

 public MTAccount ProcessUserRecord(UserRecord user)
        {
            MTAccount DALUser = new MTAccount
            {
                BrokerServerId = 1,
                Login = user.Login,
                Group = user.Group
            };
            return DALUser;
        }

关键是我要保持saveChanges调用直到循环结束,因为可能有数百条记录要调用,而且我不想进行数百次db调用。

出现错误如下:

  

会员' CurrentValues'不能为类型的实体调用   ' MTAccount'因为实体在上下文中不存在。加上   上下文的实体调用Add或Attach方法   DbSet。

1 个答案:

答案 0 :(得分:0)

好的,我把它解决了,

在我原来的代码中:

var entry = model.Entry(processedUser);
model.Entry(processedUser).CurrentValues.SetValues(processedUser);

试图更新processedUser的值 我应该说的是:

model.Entry(clientInDb).CurrentValues.SetValues(processedUser);

将更改应用于数据库

中的原始客户端

感谢您的评论。