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

3

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

我有一个旧数据库,其中包含两个表:

  • Datensatz
  • Kampagnendaten

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

Datensatz具有以下字段: Id 名称

Kampagnendaten具有以下字段: Id Idds 名称 值

Idds是保存Datensatz的Id的字段,但是在数据库中此字段未定义为外键。

我让EF Core反向工程我的模型,然后修改所创建的DatabaseContext:

Datensatz:

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)。

如果在 lambda 表达式中找到匹配项,FirstOrDefault 将仅返回 1 条记录。请尝试使用 where 子句。 - dim mik
在DatensatzModel中,关联的KampagnenData被称为“KampagnenDaten”,但是在您的请求中,您写了“d => d.KampagnenDatenList”。这里是否有打字错误? - Pac0
1个回答

2
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();

我理解了,我也觉得答案是一样的。 - dim mik
是的,这个代码可以运行,但不是我想要的:我希望能够返回包含所有相关Kampagnendaten的json Datensatz对象。如果你只获取一个Datensatz,你的示例就可以很好地工作,但是如果你获取了一个Datensatz列表,那么你必须遍历它并将所有KampangenDaten添加到每个Datensatz中,这将使它变得非常缓慢。 - PWFraley
@Pac0 不,KampagnenDaten中有11个条目,其Id为KampagnenDaten.Idds中的Datensatz。如果我使用EntityFramework生成的查询查询数据库,我确实可以获得所有11个条目,但它们从未显示在Datensatz对象中。起初我以为是查询中的FirstOrDefault,但这并没有什么区别。 - PWFraley
@PWFraley,你能否更改KampagnenDatenList的定义?应该是这样的:public virtual ICollection<KampagnenDaten> KampagnenDatenList{ get; set; }。在构造函数中,别忘了将其初始化为new List<KampagnenDaten>() - Pac0
@PWFraley:感谢您的反馈。您可以发布一个回答来描述正确的语法并接受它! - Pac0
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接