c# - 不能明确指定标识列,但也不能不指定

标签 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 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/

相关文章:

c# - 发布 .NET 程序崩溃

c# - 将查询字符串从对象转换为对象

c# - 我应该在 C# 应用程序中的什么地方放置共享常量?

java - 构建 CriteriaBuilder 查询来比较列表

c# - 在 VS2010 中将实体模型从一个项目复制到另一个项目

c# - 我应该拆分我的 edmx 吗?

c# - 客户拒绝环境中的 "scripts"。如何在 C# 应用程序中嵌入 *.ps1?

c# - 为什么SqlParameter总是设置参数为null?

sql查询查找订购过于频繁的客户?

c# - 使用 Entity Framework 6 代码优先注释映射 xmltype oracle