如何从另一个表中获取数据并插入到 EF Core 中所需的表中

Posted

技术标签:

【中文标题】如何从另一个表中获取数据并插入到 EF Core 中所需的表中【英文标题】:How to get data from another table and insert into the required table in EF core 【发布时间】:2021-11-05 04:34:32 【问题描述】:

这是 .NET 5EF Core 5.0.9 版中的 webapi 项目。我正在使用 Swagger 测试这个 API。并且数据库是 SQLite。 我有 3 个表 ProductStockHeaderStockDetail。 StockHeader 和 StockDetail 是 一对多 关系。 产品表有这些列->

身份证 姓名 费率

StockHeader 表有这些列->

HdrId 文档编号 签名 ICollection 类型的 StockDetail

StockDetail 表有这些列->

身份证 HdrId(外键) 产品编号 费率

所以,我的要求是,当我在 stockDetail 中输入 productID 的值时,它应该查找 Product 表,获取该特定 Id 的汇率并将其写入我的 StockDetails 汇率列。 我必须在 HttpPost 中执行此操作。 问题是 StockDetail 不应该有 Product 的任何引用属性。 如何在 EF Core 中实现这一点?

【问题讨论】:

StockDetail should not have any reference property of Product 为什么?该表显然有一个ProductId 字段,所以StockDetail 类可以(应该?)有一个Product 类。 EF 是一个 ORM,而不是 SQL 的替代品。它旨在将对象映射到关系表。对象有关系。 是的,我理解并接受你所说的。但是除了建立关系,我们还有什么方法可以完成任务吗? 为什么? 是什么样的?无论如何,您必须加载Product 行,才能从数据库中获取Rate。您可以使用 LINQ 查询仅按 ID 加载 Rate,但即便如此,您仍然需要查询数据库 在 DbContext 中,您可以重写方法 SaveChange,检索修改了 ProductIDStockDetails 并设置 Rate @PanagiotisKanavos 没有特别的原因。我只是出于兴趣而问。 【参考方案1】:

在 stockdetail 类中添加一个简单的产品属性,在产品类中添加一个可枚举的属性... 并使用流利的 api 在您的上下文中添加一行,将 productId 与您的对象产品映射...

modelBuilder.Entity<Product>()
            .HasMany<StockDetail>(s => s.stockDetaik)
            .WithOne(ad => ad.Product)
            .HasForeignKey<Product>(ad => ad.ProductId);

【讨论】:

感谢您的回答,但我的目标是获得没有任何关系的利率。 你需要做2个查询...一个用于获取产品,第二个用于插入和设置速率... 现在我不能我没有电脑...但是@ayankovv 是一样的...只有一件事使用 where 和 after firstordefault...【参考方案2】:

好的,我猜你会将 productId 作为输入参数。您只需进行 LINQ 查询即可从 Products DbSet 获取所需的产品。

尝试:

var product = dbContext.Products.FirstOrDefault(x => x.Id == productId);

最好检查输入参数 (productId) 是否为有效 Id,这样您就可以这样写:

if(product == null)
    throw new ArgumentException("Invalid ID", nameof(productId));

然后只分配速率,以便:

Rate = product.Rate;

【讨论】:

我会检查并回复你 它抛出错误“对象引用未设置为对象的实例”

以上是关于如何从另一个表中获取数据并插入到 EF Core 中所需的表中的主要内容,如果未能解决你的问题,请参考以下文章

Linq,EF Core - 按一个字段分组并使用其他字段从其他表中获取数据列表

我想将表单中的数据插入到表中,然后从另一个表中选择另一个数据并使用 PHP 插入到第三个表中

ef core 如何一次从具有外键的不同表中获取数据? (数据库优先)

创建表,然后将数据从另一个表插入到新表中

1 操作获取 lastinsertedID 以使用 EF 进行 2 次插入/添加

插入嵌套对象 EF Core 5