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

Posted

技术标签:

【中文标题】如何将主无键实体插入表?【英文标题】:How to insert primary keyless entity to table? 【发布时间】:2021-10-26 08:12:02 【问题描述】:

我正在使用 15 年的数据库。现在我们的方案是首先使用数据库,将实体插入到主无键表中。我阅读了很多 Microsoft EF Core 文档,例如 https://docs.microsoft.com/en-us/ef/core/modeling/keyless-entity-types?tabs=data-annotations。他们说不支持作为结论。

首先,我像往常一样添加了 HasNokey() 然后它给出了一个例外。之后,我在实体类中添加了虚拟主键,然后添加了 HasKey(x=>x.DummyId) Ignore(x=>x.DummyId) 它。但它再次不起作用。现在我很困惑。

如何处理这个问题伙计们?谢谢你的建议。

【问题讨论】:

能否添加实体的类、相关配置以及表的SQL DDL?在第一次尝试时,我认为将存储过程插入/编辑/删除实体并配置为阅读视图。 HasNoKey 好像还可以,我觉得还有一个问题。您能否提供更多详细信息或显示您的代码? 首先,谢谢大家的回复。在遇到我的前辈之后,我工作了将近一天。我们决定创建包含此表的视图并通过存储过程操作表。但是之后,我们明白不需要额外的努力,我们选择了最简单的方法,添加两列作为唯一键。作为结论,Ef core 不支持对无键主表进行操作,因此它会导致创建您的唯一键,这是处理此问题的最简单方法。 @Max 【参考方案1】:

自 5.0 版起,EF Core 不直接支持使用 DbSet 更新、删除和插入无密钥表。

我知道有两种解决方案

原始 SQL 查询

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

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

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

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

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

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");
    

【讨论】:

无法删除表,也感谢推荐。【参考方案2】:

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

 modelBuilder.Entity<SampleEntity>(entity =>
 
    entity.HasKey(e => new  e.Property1, e.Property2  );
 );

【讨论】:

以上是关于如何将主无键实体插入表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在竞争条件下将主键值插入表中?

EF6 vs Entity Framework Core:插入实体而不将主键(身份)重置为零

插入具有关联的实体时,有没有办法只使用 FK 而不是检索实体?

如何使用无键实体类型在 EF 模型中定义查询?

mysql创建数据库时怎么将主键设置为UUID,建表语句怎么写

如何使用类中的 setters 方法将数据插入 JPA 实体表?