我有两个实体DataTag和CalcDataTag:
public class CalcDataTag : BaseModel
{
[Column("CalcDataTagId")]
public override Guid ID { get; set; }
public Guid DataTagId { get; set; }
public DataTag DataTag { get; set; }
public Guid ChildDataTagId { get; set; }
public DataTag ChildDataTag { get; set; }
}
public class DataTag : BaseModel
{
[Column("DataTagId")]
public override Guid ID { get; set; }
public ICollection<CalcDataTag> CalcDataTags { get; set; }
}
我这样设置上下文:
modelBuilder.Entity<DataTag>()
.HasMany<CalcDataTag>(x => x.CalcDataTags)
.WithRequired(x => x.ChildDataTag)
.HasForeignKey(x => x.ChildDataTagId);
modelBuilder.Entity<DataTag>()
.HasMany<CalcDataTag>(x => x.CalcDataTags)
.WithRequired(x => x.DataTag)
.HasForeignKey(x => x.DataTagId);
CalcDataTags列表应该是CalcDataTags的列表,其中DataTagId或ChildDataTagId等于DataTag的ID,但设置上下文的方式,底部设置覆盖顶部设置,而我仅获得CalcDataTags列表,其中DataTagId为等于DataTag的ID。如果我切换设置,那么我只会得到CalcDataTag的列表,其中ChildCalcDataTagId等于DataTag的ID。基本上,我想要得到的是两个列表的并集。每个实体只有一个PrimaryKey,没有复合键。
您需要在DataTag
桌上摆放第二个收藏夹。别无选择。实体框架正变得困惑,因为它只能将一个一对多关系映射到一个特定的属性,而不是两个。您需要执行以下操作:
在DataTag
:
public ICollection<CalcDataTag> CalcDataTags { get; set; }
public ICollection<CalcDataTag> ChildCalcDataTags { get; set; }
在您的modelBuilder
:
modelBuilder.Entity<DataTag>()
.HasMany<CalcDataTag>(x => x.ChildCalcDataTags)
.WithRequired(x => x.ChildDataTag)
.HasForeignKey(x => x.ChildDataTagId);
modelBuilder.Entity<DataTag>()
.HasMany<CalcDataTag>(x => x.CalcDataTags)
.WithRequired(x => x.DataTag)
.HasForeignKey(x => x.DataTagId);
如果您希望能够同时抓取所有这些对象(看起来确实如此),则可能需要考虑添加一个[NotMapped]
属性,该属性将抓取两个集合的并集,如下所示:
[NotMapped]
public ICollection<CalcDataTag> AllCalcDataTags
{
return CalcDataTags.Union(ChildCalcDataTags);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句