使用附加检查更新实体

时间:2013-06-03 15:36:25

标签: c# entity-framework

例如,我有以下代码:

Product p = new Product { Id = 5, Name = "milk" };
....
cnx.Product.Attach(p);
cnx.Entry(p).State = System.Data.EntityState.Modified;
cnx.SaveChanges();

EF会生成以下查询:

update Product set Name = @parameter1 where Id = @parameter2 ...

如何强制EF为更新查询添加额外的检查,例如:

update Product set Name = @parameter1 where Id = @parameter2 AND CategoryId = @parameter3

我将举一个例子来更好地理解这个问题:

public partial class SomeEntity
{
   public int SomeEntityId { get; set; }
   public string Name { get; set; }
   public int UserId { get; set; }
   public virtual User User { get; set; }
}

我有一个MVC应用程序,我在用户登录后将UserId存储在会话中。在某些页面中,用户可以编辑SomeEntity。这是方法:

[HttpPost]
public EditSomeEntity(int someEntityId,string name)
{
    int userId = (int)Session["UserId"];
    SomeEntity updated = new SomeEntity 
    { SomeEntityId = someEntityId,Name = name, UserId = userId  };
    var MyContext cnx = new MyContext();
    cnx.SomeEntity.Attach(updated);
    cnx.Entry(updated).State = System.Data.EntityState.Modified;
    cnx.SaveChanges();    
    return View();
}

所以我需要EF生成:

update SomeEntity set Name = @parameter1 where SomeEntityId = @parameter2 AND UserId = @parameter3 

因为来自客户端的SomeEntityId很容易被更改,所以我需要检查特定实体是否对待特定用户。

1 个答案:

答案 0 :(得分:1)

您可以将ConcurrencyMode设置为Fixed

enter image description here

这将在更新时使用实体上的所有属性。

这样做的原因是确保只有在记录没有改变的情况下才更新记录。

查看更多here