【问题标题】:Update EF 4 Feature CTP 4 Detached POCO更新 EF 4 功能 CTP 4 分离 POCO
【发布时间】:2011-03-26 10:32:50
【问题描述】:

我正在尝试使用 EF 4 CTP 4 更新分离的 POCO。

我的域类如下所示:

public class User {
  public int Id { get; set; }

  [Required, DisplayName("First Name")]
  public string FirstName { get; set; }

  [Required, DisplayName("Last Name")]
  public string LastName { get; set; }

  [ConcurrencyCheckAttribute, Timestamp]
  public byte[] DataVersion { get; set; }
}

在存储库中,我有以下内容:

public void SaveUser(User user) {
  if (user.Id > 0) {
   dbContext.Users.Attach(user);
  }
  else {
   dbContext.Users.Add(user);
  }
  dbContext.SaveChanges();
}

dbContext 继承自 DbContext。

我可以很好地插入,但附件不起作用。我运行 Sql Profiler,并没有为更新发送 sql。

【问题讨论】:

    标签: .net entity-framework-4 poco


    【解决方案1】:

    我明白了……

    在 dbContext 类中,我添加了一个将实体标记为已修改的方法。

    public void MarkAsModified(object entity) {
      base.ObjectContext.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
    }
    

    我的存储库方法现在看起来像这样

    public void SaveUser(User user) {
      if (user.Id > 0) {
        dbContext.Users.Attach(user);
        dbContext.MarkAsModified(user);
      }
      else {
        dbContext.Users.Add(user);
      }
    
      dbContext.SaveChanges();
    }
    

    【讨论】:

    • 嗨。我现在已经搜索了很长时间,只是为了“更新 linq 中的分离对象”,并且两条线现在都在工作 'db.UserProfileSet.Attach(User)` db.ObjectStateManager.ChangeObjectState(User, EntityState.Modified)
    【解决方案2】:

    我知道这基本上是在做同样的事情,但我所做的是在您的用户存储库中有一个名为 GetForUpdate 或类似名称的方法:

    public User GetForUpdate(int id)
    {
        var u = new User();
        u.Id = id;
        dbContext.Users.Attach(u);
        return u;
    }
    

    那么当你想“更新”一个已知 id 的用户时:

    var user = userRepo.GetForUpdate(id);
    user.Name = "John Doe";
    user.Username = "john.doe";
    userRepo.SaveUser(user);
    

    附加用户并然后修改属性将自动将EntityState设置为Modified

    HTH

    【讨论】:

    • 明白了,感谢您的提示。唯一的问题是我正在使用 MVC,并且想利用模型绑定。在您的示例中,我需要先调用 repo.GetForUpdate,然后调用 UpdateModel,然后再调用 Save。但很高兴知道还有其他选择。
    • Scott suggests to use the UpdateModel() method 在控制器中,但显然这不适用于此处。我认为这个Attach 可能已损坏或不完整?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多