我遇到了一个问题 22。当我像这样创建一个新对象并使用 EF 存储它时,出现错误。
private void DataGrid_OnAddingNewItem(object sender, AddingNewItemEventArgs eventArgs)
{
eventArgs.NewItem = new Customer
{
Id = Guid.NewGuid(),
Discount = 0
};
}
该表中唯一的标识列是 LookUp 并且错误一直困扰着它。
DEFAULT or NULL are not allowed as explicit identity values.
但是(这是第 22 个吸引人的地方),当我确定该值不是默认值也不是 null 时,我遇到了另一个问题。
private void DataGrid_OnAddingNewItem(object sender, AddingNewItemEventArgs eventArgs)
{
eventArgs.NewItem = new Customer
{
Id = Guid.NewGuid(),
LookUp = -1,
Discount = 0
};
}
问题表现如下。
Cannot insert explicit value for identity column in table 'Customers' when IDENTITY_INSERT is set to OFF.
我正在使用 EF,但不确定如何将标识插入设置为关闭。事实上,我什至不确定这是否可能。即使我知道该怎么做,它仍然像是隐藏问题,而不是解决问题。
我敢打赌,我需要能够省略 LookUp 字段的规范,并且仍然能够将该内容插入到数据库中。不过,我不确定怎么做,也不知道如何处理。
最佳答案
您需要告诉 EF 您想要自己生成值。您可以这样使用数据注释:
using System.ComponentModel.DataAnnotations.Schema;
public class Customer
{
[DatabaseGenerated(DatabaseGeneratedOptions.None)]
public Guid Id { get; set; }
..
}
或者通过覆盖 DbContext 中的 OnModelCreating:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>().Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
..
}
如果您希望数据库为您生成 Id,您可以将 DatabaseGeneratedOptions.None
替换为 DatabaseGeneratedOptions.Identity
关于c# - 不能明确指定标识列,但也不能不指定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33891101/