MVC实体框架说该字段是NULL但不是

时间:2013-03-06 20:03:44

标签: asp.net-mvc entity-framework

我需要创建新对象并将其添加到DB。首先,我将唯一ID设置为Product(我的实体)。并返回用户可以设置其他字段的视图。

     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的实体。

错误在哪里?

2 个答案:

答案 0 :(得分:3)

如果您想手动提供密钥并且密钥不是数据库中的自动生成标识,您必须告知实体框架,例如您的Product模型中的数据注释:

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

    //...
}

使用Fluent API,它是:

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

int键的默认值是EF假定在数据库中生成ID,并且EF不会将ID值发送到DB,即使它已在模型中设置。数据库抛出异常,因为它没有在INSERT语句中获取密钥。

答案 1 :(得分:0)

可能在您回发时未设置ID。你应该在post方法中设置它。