我需要创建新对象并将其添加到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的实体。
错误在哪里?
答案 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方法中设置它。