[英]EF Core DDD Many-to-many
我正在嘗試使用 EF Core 來關注 DDD,在我的 model 中,我有以下內容:
private List<TeamPerson> _personLinks;
public IReadOnlyCollection<TeamPerson> PersonLinks => _personLinks?.ToList().AsReadOnly();
public IReadOnlyCollection<Person> Members => _personLinks?.Select(l => l.Person).ToList().AsReadOnly();
我想封裝 Team 和 Person 模型之間的關系。 我必須馬上說,Person model 有一個映射,它可以工作。
但是如果我指定屬性訪問模式:
builder.HasMany(e => e.PersonLinks)
.WithOne(e => e.Team)
.HasForeignKey(e => e.TeamId)
.Metadata.PrincipalToDependent.SetPropertyAccessMode(PropertyAccessMode.Field);
builder.HasMany(e => e.TeamLinks)
.WithOne(e => e.Person)
.HasForeignKey(e => e.PersonId)
.Metadata.PrincipalToDependent.SetPropertyAccessMode(PropertyAccessMode.Field);
如果我嘗試獲取dbContext.Teams.Include(t => t.PersonLinks).ThenInclude(t => t.Person)
,我會收到錯誤消息:“...PersonId1 列不存在... ",我有這個用於 TeamPerson model 映射:
builder.Property(e => e.PersonId).IsRequired().HasColumnName("person_id");
我的錯誤是什么,或者有什么其他方法可以在這里實現集合的封裝?
我認為您需要在 Person 和 PersonLinks 之間以及 Team 和 PersonLinks 之間配置一對多關系以實現多對多關系。
builder.Entity<PersonLink>()
.HasKey(personLink => new { personLink.TeamId, personLink.PersonId });
builder.Entity<PersonLink>()
.HasOne<Team>(personLink => personLink.Team)
.WithMany(team => team.PersonLinks)
.HasForeignKey(personLink => personLink.TeamId);
builder.Entity<PersonLink>()
.HasOne<Person>(personLink => personLink.Person)
.WithMany(person => person.PersonLinks)
.HasForeignKey(personLink => personLink.PersonId);
這當然只有在您的PersonLink class 看起來像這樣的情況下才有效:
public class PersonLink
{
public int PersonId { get; set; }
public Person Person { get; set; }
public int TeamId { get; set; }
public Team Team { get; set; }
}
對於 id 數據類型,我假設一個簡單的 int 可以是字符串或 GUID(甚至是代碼中的一些自定義類型),但我認為這在這里並不重要。
注意:我忍不住將PersonLinks重命名為PersonLink ,這對我來說感覺更自然,因為從我的角度來看,class 代表團隊和個人之間的一個人鏈接。 另外,我知道在某種程度上為 lambda 表達式使用縮寫參數名稱是一種約定,但我認為,特別是在這種情況下,它更容易閱讀,而不是使用p (用於 Person)和pl (用於 PersonLink) - 也許這只是一個問題在這種情況下的味道......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.