【问题标题】:EF Core cannot insert the value null into column with default valueEF Core 无法将值 null 插入到具有默认值的列中
【发布时间】:2017-03-14 19:53:56
【问题描述】:

我有实体

public class Realtor
{
    [Key]
    public int Id { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Guid { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime Registration { get; set; }

    [ForeignKey("Id")]
    public int SubdivId { get; set; }
    public Subdiv Subdiv { get; set; }
}

和 OnModelCreating 方法的上下文

modelBuilder.Entity<Realtor>(real => {
            real.Property<Guid>(p => p.Guid)
            .HasDefaultValueSql("newsequentialid()");

            real.Property<DateTime>(p => p.Registration)
            .HasDefaultValueSql("getdate()");

            real.HasOne(r => r.Subdiv)
            .WithMany(s => s.Realtors)
            .HasForeignKey(r => r.SubdivId);
        });

我为属性注册设置了默认值,但是当我进行插入时,我得到了异常:无法将值 null 插入到列注册中。

【问题讨论】:

  • 为什么你有一个 DateTime 作为身份?那不应该在那里,为什么你同时有一个 Guid 和一个 Id,并试图同时制作身份?
  • 如何为不可为空的DateTime 属性设置null 值?更有可能是[DatabaseGenerated(DatabasegeneratedOption.Identity)] 属性。我想Identity 不是为DateTime 值定义的,而只是int
  • 也许我尝试删除
  • 您在进行代码优先迁移吗?
  • @你在做代码优先迁移@是的。

标签: c# .net entity-framework


【解决方案1】:

首先,删除Restration[DatabaseGenerated(DatabaseGeneratedOption.Identity)]。这可能是您异常的原因。如果您不想让它为空并且想用您的实体设置值,您也可以:

public DateTime Restration { get; set; } = DateTime.Now;

应该可以(我这里没有 VS 2015,所以你必须测试。否则在构造函数中设置 Restration 的值。)

更新: 并至少删除这一行

real.Property<DateTime>(p => p.Registration)
        .HasDefaultValueSql("getdate()");

【讨论】:

    【解决方案2】:
    1. 删除

      [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
      
    2. 在您的 Realtor 类中添加一个构造函数。

      public Realtor()
      {
        this.Guid = Guid.NewGuid();
        this.Restration = DateTime.Now;
      }
      
    3. 并从 OnModelCreating 中删除它

      real.Property<Guid>(p => p.Guid).HasDefaultValueSql("newsequentialid()");
      real.Property<DateTime>(p => p.Restration).HasDefaultValueSql("getdate()");
      

    【讨论】:

    • 有效!但我认为这是一个可疑的决定。毕竟,它应该在 EF 中工作。
    • @Matthias Burger 对不起。我没有看到你的答案
    猜你喜欢
    • 2017-06-17
    • 2014-11-19
    • 2020-08-20
    • 2023-03-04
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多