2016-03-24 125 views
0

我想遍历一系列传入记录,检查我的数据库以查看它们是否已经存在,并根据需要添加或更新它们。我没有成功。实体框架 - 更新或添加

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调用直到循环结束,因为可能有数以百计的记录打电话,我不想让上百分贝的呼叫。

有误差如下:

会员“CurrentValues”不能被称为类型 “MTAccount”的实体,因为实体没有在上下文中。要向上下文添加 实体,请调用DbSet的Add或Attach方法 。

+1

和你的代码有什么问题? –

+0

由于您已经构建了这个结构,调用SaveChanges的位置并不重要,您仍然可以拨打数百个电话。您需要批量插入/更新,这在EF中本地不可用,并且需要扩展库 –

+0

您的模型是什么?当然,你只需要模型,并添加一个新的实体或在调用'SaveChanges()'之前编辑匹配的实体 - 你在做什么?有什么问题? – RemarkLima

回答

0

好吧,我在原来的代码中,我有工作了,

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

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

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

从数据库

012施加变更到原始客户端

感谢您的意见。