不能明确指定标识列,但也不能指定它

时间:2015-11-24 10:24:50

标签: c# sql entity-framework

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

private void DataGrid_OnAddingNewItem(object sender, AddingNewItemEventArgs eventArgs)
{
  eventArgs.NewItem = new Customer
  {
    Id = Guid.NewGuid(),
    Discount = 0
  };
}

该表中唯一的标识列是 LookUp ,错误就像这样唠叨。

  

不允许使用DEFAULT或NULL作为显式标识值。

然而(这是22个引人注目的地方),当我确定该值不是默认值而不是如下null时,我会遇到另一个问题。

private void DataGrid_OnAddingNewItem(object sender, AddingNewItemEventArgs eventArgs)
{
  eventArgs.NewItem = new Customer
  {
    Id = Guid.NewGuid(),
    LookUp = -1,
    Discount = 0
  };
}

问题表现如下。

  

无法在表格中插入标识列的显式值'客户'当IDENTITY_INSERT设置为OFF时。

我正在与EF合作,我不确定如何将身份插入设置为关闭。事实上,我甚至不确定它是否可行。即使我知道如何,它仍然似乎隐藏问题,而不是解决它。

我敢打赌,我需要能够省略 LookUp 字段的规范,并且仍然能够将该事物插入到数据库中。但不知道怎么做,我也不知道如何处理它。

2 个答案:

答案 0 :(得分:3)

您需要告诉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

答案 1 :(得分:0)

不是回答我自己的问题的忠实粉丝,特别是当我发现的答案更像是一个隐藏问题而不是解决问题但在这里它会发生。

  1. 删除整个模型(删除EDMX文件)。
  2. 保存所有文件。
  3. 清除所有文件,然后重建解决方案(这将失败)。
  4. 关闭项目。
  5. 重启VS。
  6. 重新加载项目。
  7. 创建新模型(添加和配置EDMX文件)。
  8. 保存所有文件。
  9. 重建解决方案。
  10. 噗 - 它有效。奇怪的...