C# Can';t显式指定标识列,但也可以';I don’我不想透露

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,错误就这样纠缠着它 默认值

我在这里碰到了第22条。当我创建一个像这样的新对象并使用EF存储它时,我得到了错误

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

不太喜欢回答我自己的问题,尤其是当我找到的答案更像是隐藏问题而不是解决问题时

  • 删除整个模型(删除EDMX文件)
  • 保存所有文件
  • 清除所有文件,然后重新生成解决方案(这将非常失败)
  • 关闭项目
  • 重启VS
  • 重新加载项目
  • 创建新模型(添加并配置EDMX文件)
  • 保存所有文件
  • 重建解决方案

  • 噗-它起作用了。奇怪…

    我看到你的方法了。但是,我不希望自己指定该值。我希望EF能够处理这个问题,而无需我在代码中做任何额外的工作。您是否知道在模型、EMDX文件等中指定的位置?请参阅我的更新答案,了解如何在代码中执行此操作。我还没有先和模特合作过,所以我可以帮你。如果可能的话,如果您计划将来迁移到EF7,我强烈建议您首先使用代码。