C# 实体框架-更新或添加

C# 实体框架-更新或添加,c#,entity-framework,C#,Entity Framework,我想循环查看一系列传入的记录,检查我的数据库,看看它们是否已经存在,并根据需要添加或更新它们。我几乎没有成功 var listOfClientAccounts = model.MTAccounts.ToList(); // single DB query // for each of the users MTManager foreach (var user in users) { var clientInDb = listOfClientAcco

我想循环查看一系列传入的记录,检查我的数据库,看看它们是否已经存在,并根据需要添加或更新它们。我几乎没有成功

    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方法 数据库集

好吧,我算出来了

在原始代码中,我有:

var entry = model.Entry(processedUser);
model.Entry(processedUser).CurrentValues.SetValues(processedUser);
正在尝试更新processedUser的值 我应该说的是:

model.Entry(clientInDb).CurrentValues.SetValues(processedUser);
将更改应用于数据库中的原始客户端


感谢您的评论。

您的代码有什么问题吗?按照您的结构,无论在何处调用SaveChanges,您仍将进行数百次调用。您需要批量插入/更新,这在EF中本机不可用,需要扩展库。您的模型是什么?当然,在调用
SaveChanges()
之前,您只需获取模型,然后添加一个新实体或编辑匹配的实体即可?问题是什么?@DavidL我不认为这完全正确,它可能会执行数百条语句,但它会在单个连接上的单个事务中执行所有这些语句,而不是一次打开/执行/关闭一个连接。@CodingGorilla是的,这在技术上是正确的,这也不能减轻OP的担忧,即无论在何处调用SaveChanges,仍将执行数百个调用/语句。也就是说,您的观点绝对正确……在循环中调用它会有更大的性能问题。