簡體   English   中英

EF Core DDD 多對多

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM