【问题标题】:Entity Framework Core assigning null value to non-null primary key实体框架核心将空值分配给非空主键
【发布时间】:2017-02-13 22:14:36
【问题描述】:

更新:我已经解决了这个问题。在我的情况下,我的迁移中缺少解决方案,并且将特定于您的数据库管理器。

修复是迁移中的这一行:

Id = table.Column<long>(nullable: false)
  .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn)

我有一个表,我试图让 EF 处理 id 生成。 Id 很长。

模型如下:

public virtual long Id { get; set; }    
public virtual DateTime Created { get; set; }

迁移看起来像:

migrationBuilder
    .CreateTable("MyEntity",
        table => new
        {
            Id = table.Column<long>(nullable: false),
            Created = table.Column<DateTime>(nullable: false)
        }

模型快照如下:

modelBuilder.Entity("MyEntity", b =>
                {
                    b.Property<long>("Id")
                        .ValueGeneratedOnAdd();
                    b.Property<DateTime>("Created");
                    b.HasKey("Id");
                }

当创建一个新实体而不设置 Id 时,Id 的默认值为 0。当将该值插入 dataContext.MyEntities.Add(newEntity) 并检查该实体时,它现在有一个非常大的负值(似乎是负长。最大值)。问题是在dataContext.SaveChanges(); EF 期间的某个时候似乎将此负值转换为 null 并抛出。

架构:

CREATE TABLE "MyEntity" (
    "Id" bigint NOT NULL,
    "Created" timestamp without time zone NOT NULL,
);

【问题讨论】:

  • 你能把生成的表格设计/模式贴出来
  • 每个数据库提供者的实现都不同。这是哪一个?
  • 这适用于 postgres,使用 "Npgsql.EntityFrameworkCore.PostgreSQL": "1.1.0", "Npgsql.EntityFrameworkCore.PostgreSQL.Design": "1.1.0"
  • 是的......你必须找出他们是如何实现它的。
  • 看这里的红色文字块:docs.microsoft.com/en-us/ef/core/modeling/…

标签: c# entity-framework .net-core entity-framework-core


【解决方案1】:

试试:

modelBuilder.Entity<MyEntity>().HasKey(e => e.Id).HasName("Id");

或添加 Key 装饰器(数据注解):

[Key]
public virtual long Id { get; set; }

见:

https://docs.microsoft.com/en-us/ef/core/modeling/relational/columns

https://msdn.microsoft.com/en-us/library/jj591583(v=vs.113).aspx

【讨论】:

  • 我已经在帖子中更新了我的模型快照以反映这一点,它将键属性设置为 Id,但仍将其设置为 null。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 2018-04-11
相关资源
最近更新 更多