Asp.net mvc MVC实体框架表示该字段为空,但它';不是

Asp.net mvc MVC实体框架表示该字段为空,但它';不是,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我需要创建新对象并将其添加到数据库中。首先,我将唯一ID设置为产品(我的实体)。并返回用户可以在其中设置其他字段的视图 public ViewResult Create() { var product = new Product { ProductID = GetFreeId() }; return View("Edit",product); } 观点: @using (Html.BeginForm()) { @Html

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

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

@using (Html.BeginForm()) {
@Html.EditorForModel()
<input type="submit" value="Save" />}
如果我在最后一个方法中放置断点,我将看到
product.ProductID=10
,但是在
字符串上下文中。SaveChanges()我得到异常:

无法插入ProductID=null的实体


错误在哪里?

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

当您发回时,可能没有设置ID。您应该在post方法中进行设置。

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

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

    //...
}
使用Fluent API,它是:

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

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

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

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

    //...
}
使用Fluent API,它是:

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

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

只是想知道您是否会返回AddProduct actionresult?是的。[HttpPost]公共操作结果创建(产品){if(ModelState.IsValid){repository.AddProduct(产品);只是想知道您是否返回到AddProduct操作结果?是。[HttpPost]公共操作结果创建(产品){if(ModelState.IsValid){repository.AddProduct(产品);谢谢!我应该将什么类型设置为ProductID而不是int来避免这个问题?@Stalli:For
string
Guid
,我相信,
DatabaseGeneratedOption
默认为
None
。但是我会将其保留为
int
,只需覆盖上面所示的默认值。有覆盖de的选项错误,使用此选项没有错。谢谢!我应该将什么类型设置为ProductID而不是int以避免此问题?@Stalli:For
string
Guid
,我相信
DatabaseGeneratedOption
默认为
None
。但我会将其保留为
int
,并将默认值改写为shown。有覆盖默认值的选项,使用此选项没有任何错误。