使用 Fluent API 创建的 Entity Framework Core 2 一对多

Posted

技术标签:

【中文标题】使用 Fluent API 创建的 Entity Framework Core 2 一对多【英文标题】:Entity Framework Core 2 One to Many created with Fluent API 【发布时间】:2018-02-08 07:58:02 【问题描述】:

希望你能帮我解决这个问题:

我有一个旧数据库,里面有两个表:

数据统计 运动

一个 Datensatz 可以有 0 到多个 Kampagnendaten。到目前为止没有什么特别的,但是:

Datensatz 具有以下字段: ID 名称

Kampagnendaten 具有以下字段: ID 编号 姓名 价值

Idds是保存数据的Id的字段,但是这个字段在数据库中没有定义为外键。

我让 EF Core 对我的模型进行逆向工程,然后我修改了创建的 DatabaseContext:

数据:

entity.HasMany<KampagnenDaten>(d => d.KampagnenDatenList).WithOne().HasForeignKey(k => k.Idds);

运动:

entity.HasOne<Datensatz>().WithMany(d => d.KampagnenDatenList).HasForeignKey(k => k.Idds).HasPrincipalKey(d => d.Id);

我还修改了 DatensatzModel:

List<KampagnenDaten> KampagnenDaten  get; set; 

现在当我执行以下操作时:

context.Datensatz.Include(d => d.KampagnenDatenList).FirstOrDefault<Datensatz>(d => d.Id == id);

我得到一个 Datensatz,它有一个 KampagnenDaten 数组,其中只包含一个元素。

我怎样才能为 Datensatz 获得所有的 KampagnenDaten? (是的,Datensatz 在 KampagnenDaten 表中有 11 个 KampagnenDaten)。

【问题讨论】:

FirstOrDefault 如果在您的 lambda 表达式中找到匹配项,则仅返回 1 条记录。尝试使用where 子句 在 DatensatzModel 中,链接的 KampagnenData 称为 KampagnenDaten,但在您的请求中您写了 d =&gt; d.KampagnenDatenList。这里有错字吗? 【参考方案1】:
var datensatz = context.Datensatz.Include(d => d.KampagnenDatenList).FirstOrDefault<Datensatz>(d => d.Id == id);
var datensatzId = datensatz.Id;

// what you want. You can add includes if you need.
var kdList = context.KampagnenDaten.Where(k => k.Idds == datensatzId).ToList();

【讨论】:

我理解相同,我也认为相同的答案 是的,这可行,但不完全是我想要的:我希望能够将 Datensatz 对象作为包含所有相关 Kampagnendaten 的 json 返回。如果您只获得一个 Datensatz,您的示例效果很好,但如果您获得一个 Datensatz 列表,那么您必须通过它并将所有 KampangenDaten 添加到每个 Datensatz,这会非常慢。 @Pac0 是的,它是一对多的关系,一个 Datensatz 可以有 0 到 x 个 KampagnenDaten,每个 KampagnenDaten 正好有一个 Datensatz。 @Pac0 否,KampagnenDaten 中有 11 个条目,其 Id 为 KampagnenDaten.Idds 中的 Datensatz。如果我使用 EntityFramework 生成的 Query 查询数据库,我会得到所有 11 个条目,但它们从未出现在 Datensatz 对象中。起初我认为它是查询中的 FirstOrDefault 但这并没有什么区别。 @PWFraley 你能改变 KampagnenDatenList 的定义吗?应该是:public virtual ICollection&lt;KampagnenDaten&gt; KampagnenDatenList get; set; IMO。 (并且在构造函数中,不要忘记将其初始化为new List&lt;KampagnenDaten&gt;()

以上是关于使用 Fluent API 创建的 Entity Framework Core 2 一对多的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Code First Fluent Api:向列添加索引

使用 Entity Framework Fluent API 的一对一可选关系

Entity Framework Fluent API

如何使用 Entity Framework Code First Fluent API 指定表名

Entity Framework Code First Fluent API - 配置关系

Entity Framework Code-First(10):Fluent API