0

我需要创建新对象并将其添加到数据库。首先,我将唯一 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 的实体。

错误在哪里?

4

2 回答 2

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 语句中获得键。

于 2013-03-06T20:13:55.013 回答
0

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

于 2013-03-06T20:08:47.220 回答