【问题标题】:C# and EF cannot insert NULL to Id columnC# 和 EF 不能将 NULL 插入到 Id 列
【发布时间】:2020-05-06 14:54:15
【问题描述】:

我在 C# 中有具有 Id 列的实体。这是主键。但我不把它作为身份列。我想在我的 C# 代码中为 Id 列赋值。 实体:

    public class MasterReview
        {
            public int Id { get; set; }

在数据库中,我有列 ID,身份规范设置为否。 在 C# 中,当我添加新实体时,我将值设置为 Id:

    public void Add(int reviewId, string title, string language, string assignee)
            {
                using (var uow = unitOfWorkFactory.CreateUnitOfWork())
                {
                    uow.MasterReviewRepository.Add(new Models.MasterReview()
                    {
                        Id = reviewId,
                        Title = title,
                        Language = language,
                        Assignee = assignee
                    });

                    uow.Save();
                }
            }

当我打电话给uow.Save 我得到错误:

无法将值 NULL 插入到列“Id”、表“MyApp.dbo.MasterReview”中;列不允许空值。插入失败。

值已设置,不为空。现在是 3。

【问题讨论】:

  • 如果您对Id = 3 之类的内容进行硬编码,它是否会按预期值保存?想尝试找出故障点。
  • 您是否尝试打开 SQL Profiler 来查看作为插入查询生成的内容?
  • 我更喜欢使用字符串作为 Id,然后使用盐创建 GUID。检查您的表格 ID 是什么数据类型。
  • 我添加了一个截图。如您所见,Id 设置为 4,但仍然出现错误

标签: c# entity-framework


【解决方案1】:

尝试添加DatabaseGeneratedOption.None注解

public class MasterReview
{
   [DatabaseGenerated(DatabaseGeneratedOption.None)]
   public int Id { get; set; }
}

或者如果你使用 FluentAPI

modelBuilder.Entity<MasterReview>().Property(t => t.Id)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

DatabaseGeneratedOption.None 选项指定属性的值不会由底层数据库生成。因此,如果您想为 id 属性提供自己的值而不是数据库生成的值,请使用它

但请注意:当Id 是主键属性时,如果您每次不提供唯一值,EF 都会抛出异常。

【讨论】:

  • 注意:如果使用 EF Core,FluentAPI 是.ValueGeneratedNever()
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多