2013-06-03 86 views
1

例如,我有以下代碼:更新與其他檢查實體

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從客戶端來了很容易可以改變的,所以我需要檢查特定的實體對待特定用戶。

+0

爲什麼'CategoryId'很重要?你是說有多個產品具有相同的'Id'? – SOfanatic

+0

沒有它的例子 – user2448388

回答

1

您可以設置ConcurrencyModeFixed

enter image description here

更新時,這將使用一個實體的所有屬性。

其行爲如此的原因是爲了確保只有在記錄未更改時才更新記錄。

查看更多here