2013-03-06 44 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