【问题标题】:MVC Entity framework says that field is NULL but it's notMVC 实体框架说该字段为 NULL 但它不是
【发布时间】:2013-03-06 20:03:43
【问题描述】:

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

哪里出错了?

【问题讨论】:

  • 只是想知道您回到 AddProduct actionresult 吗?
  • 是的。 [HttpPost] public ActionResult Create(Product product) { if (ModelState.IsValid) { repository.AddProduct(product);

标签: asp.net-mvc entity-framework


【解决方案1】:

如果您想手动提供密钥并且密钥不是数据库中自动生成的身份,您必须将此告知实体框架,例如在您的 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 语句中获得键。

【讨论】:

  • 谢谢你!我应该将什么类型设置为 ProductID 而不是 int 以避免此问题?
  • @Stalli:对于stringGuid,我相信DatabaseGeneratedOption 默认是None。但我会将其保留为 int 并覆盖默认值,如上所示。有覆盖默认的选项,使用这个选项没有错。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多