2013-03-06 42 views
0

我需要創建新對象並將其添加到數據庫。首先,我爲產品(我的實體)設置唯一的ID。並返回用戶可以設置其他字段的視圖。MVC實體框架說該字段爲NULL,但它不是

 public ViewResult Create() 
    { 
     var product = new Product { ProductID = GetFreeId() };  
     return View("Edit",product); 
    } 

的觀點:

@using (Html.BeginForm()) { 
@Html.EditorForModel() 
<input type="submit" value="Save" />} 

再通過控制器,我們得出這樣的方法:

public void AddProduct(Product product) 
{ 
    context.Products.Add(product); 
    context.SaveChanges(); 
} 

如果我把一個斷點在最後的方法,我會看到product.ProductID=10但對string context.SaveChanges();我得到異常:

無法插入ProductID爲null的實體。

錯誤在哪裏?

+0

只是想知道你回到AddProduct actionresult? – ssilas777 2013-03-06 20:12:35

+0

是的。 [HttpPost] public ActionResult Create(Product product) if(ModelState.IsValid) { repository.AddProduct(product); – Stalli 2013-03-06 20:15:47

回答

2

如果要手動提供鍵和關鍵不是在數據庫中自動生成的身份你一定要告訴這對實體框架,例如用數據說明在Product型號:

public class Product 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int ProductID { get; set; } 

    //... 
} 

隨着流利的API,它是:

modelBuilder.Entity<Product>() 
    .Property(p => p.ProductID) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

int鍵的默認是EF假定ID在數據庫中生成和EF不會ID值發送到數據庫,即使是在你的模型設定。數據庫拋出一個異常,然後因爲它在INSERT語句中沒有得到一個鍵。

+0

謝謝你!我應該將什麼類型設置爲ProductID而不是int以避免此問題? – Stalli 2013-03-06 20:21:30

+0

@Stalli:對於'string'和'Guid',我相信'DatabaseGeneratedOption'默認爲'None'。但是我會把它留給一個'int',並且只是覆蓋默認值,如上所示。可以選擇重寫默認值,使用此選項沒有任何問題。 – Slauma 2013-03-06 20:28:14

0

可能當您發回ID未設置。你應該在post方法中設置它。

+0

它沒有幫助。 – Stalli 2013-03-06 20:17:02