C# Can';t显式指定标识列,但也可以';I don’我不想透露
我在这里碰到了第22条。当我创建一个像这样的新对象并使用EF存储它时,我得到了错误C# Can';t显式指定标识列,但也可以';I don’我不想透露,c#,sql,entity-framework,C#,Sql,Entity Framework,我在这里碰到了第22条。当我创建一个像这样的新对象并使用EF存储它时,我得到了错误 private void DataGrid_OnAddingNewItem(object sender, AddingNewItemEventArgs eventArgs) { eventArgs.NewItem = new Customer { Id = Guid.NewGuid(), Discount = 0 }; } 该表中唯一的标识列是LookUp,错误就这样纠缠着它 默认值
private void DataGrid_OnAddingNewItem(object sender, AddingNewItemEventArgs eventArgs)
{
eventArgs.NewItem = new Customer
{
Id = Guid.NewGuid(),
Discount = 0
};
}
该表中唯一的标识列是LookUp,错误就这样纠缠着它
默认值或NULL不允许作为显式标识值
然而(这是22个吸引人的地方),当我确保值不是默认值或空值时,我遇到了另一个问题
private void DataGrid_OnAddingNewItem(object sender, AddingNewItemEventArgs eventArgs)
{
eventArgs.NewItem = new Customer
{
Id = Guid.NewGuid(),
LookUp = -1,
Discount = 0
};
}
问题表现为以下几点
当identity_insert设置为OFF时,无法在表“Customers”中插入identity列的显式值
我正在使用EF,我不知道如何将标识插入设置为关闭。事实上,我甚至不确定这是否可能。即使我知道怎么做,也似乎是隐藏问题,而不是解决问题
我打赌我需要能够省略LookUp字段的规范,并且仍然能够将该内容插入数据库。不过,我不知道如何实现,也不知道如何实现。你需要告诉英孚,你想自己创造价值。您可以使用数据注释,因此:
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);
..
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().Property(x=>x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
..
}
如果您希望数据库为您生成Id,您可以将
数据库生成选项.None
交换到数据库生成选项.Identity
不太喜欢回答我自己的问题,尤其是当我找到的答案更像是隐藏问题而不是解决问题时
噗-它起作用了。奇怪…我看到你的方法了。但是,我不希望自己指定该值。我希望EF能够处理这个问题,而无需我在代码中做任何额外的工作。您是否知道在模型、EMDX文件等中指定的位置?请参阅我的更新答案,了解如何在代码中执行此操作。我还没有先和模特合作过,所以我可以帮你。如果可能的话,如果您计划将来迁移到EF7,我强烈建议您首先使用代码。