如何将主键无实体插入表?

问题描述 投票:0回答:2

我正在和 15 岁的 DB 一起工作。现在我们的场景是数据库优先,将实体插入到无键表中。我阅读了很多 microsoft EF Core 文档,例如 https://learn.microsoft.com/en-us/ef/core/modeling/keyless-entity-types?tabs=data-annotations,结论是:不支持。

首先,我像往常一样添加了

HasNokey()
,但它抛出了异常。之后,我在实体类中添加了一个虚拟主键,然后
HasKey(x=>x.DummyId)
Ignore(x=>x.DummyId)
,但这也不起作用。

c# entity-framework .net-core
2个回答
3
投票

从版本 5.0 开始,EF Core 不直接支持更新、删除和插入带有

DbSet
的无键表。

我知道有两种解决方案

原始 SQL 查询

在 EF Core 中,可以执行原始 SQL 命令。您可以创建一个 SQL 命令来执行插入并手动执行它。 Microsoft 文档 (https://learn.microsoft.com/en-us/ef/core/querying/raw-sql) 并未涵盖您的确切用例,但您可以直接在

Database 上使用原始或插值 SQL 
DbContext
的成员。

    var ctx = new DbContext(options);
    ctx.Database.ExecuteSqlRaw("INSERT INTO Table_Name .....");

更改数据库架构 您可以将主键列添加到架构中,以便 EF core 能够按预期使用它进行更新、插入和删除。一般来说,更改将遵循以下步骤。

  1. 创建一个与旧表相同的新表
  2. 添加自动递增的主键列
  3. 将旧表中的数据复制到新表
  4. 删除旧表
  5. 将新表重命名为旧表的名称

完成后,您需要更改实体定义,如下所示。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<ConfigTemplate>(entity =>
    {
         // Adding the key itself, using the index name as well
         entity.HasKey(e => e.primary_key)
               .HasName("PRIMARY");

         // Adding the index definition is not a required
         entity.HasIndex(e => e.primary_key)
               .HasName("PRIMARY");

         entity.ToTable("config_template");
    }
}

-1
投票

如果您的无键表有一些其他列可以用作复合键,您可以尝试在 dbcontext 中更新该实体的配置作为解决方法,但我同意使用新主键修改现有表是更好的解决方案

 modelBuilder.Entity<SampleEntity>(entity =>
 {
    entity.HasKey(e => new { e.Property1, e.Property2  });
 });
© www.soinside.com 2019 - 2024. All rights reserved.