【问题标题】:Can't specify identity column explicitly BUT ALSO can't leave it unspecified不能明确指定标识列但也不能不指定它
【发布时间】:2015-11-24 10:24:49
【问题描述】:

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

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

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

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

但是(这是 22-catchy 的地方),当我确保该值不是默认值或 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 字段的规范,并且仍然能够将事物插入到数据库中。不过不知道怎么做,也不知道怎么处理。

【问题讨论】:

    标签: c# sql entity-framework


    【解决方案1】:

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

    【讨论】:

    • 我明白你的做法。但是,我更愿意不要自己指定值。我希望 EF 能够处理这个问题,而无需我在代码中做任何额外的事情。您是否知道它在模型、EMDX 文件等中指定的位置?
    • 查看我的更新答案,了解如何在代码中执行此操作。我没有与 Model First 合作过,所以我可以在那里为您提供帮助。如果可能的话,如果您计划将来迁移到 EF7,我强烈建议您使用 Code First。
    【解决方案2】:

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

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

    噗——它起作用了。奇怪...

    【讨论】:

      猜你喜欢
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2019-06-13
      • 1970-01-01
      相关资源
      最近更新 更多