簡體   English   中英

EF Core:域中沒有導航屬性的一對多關系

[英]EF Core: One to many relationship without navigation property in domain

嗨,互聯網的好人:)
我正在嘗試將 EF Core 5 實體用作 DDD 意義上的域實體。

我有兩個實體的案例,每個實體都有自己的身份(意味着它們是 DDD 對象的實體類型,而不是 ValueObjects):國家和貨幣。

貨幣可以屬於多個國家(例如歐元)。 另一方面,國家/地區只能有一種“當前有效”的貨幣,這不一定是始終相同的貨幣(例如,歐盟國家/地區放棄自己的本國貨幣以換取歐元)。

在特定的域有界上下文中,我只需要:

public class Country : Entity<Guid>
{
    public string Name { get; private set; }
    // the rest is omitted for readability
    public Currency Currency { get; private set; }
}

public class Currency : Entity<Guid>
{
    public string Name { get; set; }
    public string Code { get; set; }
}

我不想擁有導航屬性: public ICollection<Country> Countries { get; private set; } public ICollection<Country> Countries { get; private set; } public ICollection<Country> Countries { get; private set; }對貨幣的實體,只是為了能夠定義1:N的關系,因為這只會污染我的域名。

我試圖將導航屬性添加為 EF 陰影屬性,但 EF 不允許它,拋出異常:

導航“國家/地區”無法添加到實體類型“貨幣”,因為基礎類型上沒有對應的 CLR 屬性,並且無法在陰影狀態下添加導航屬性。

國家不能擁有貨幣(在 EF 意義上為 OwnsOne),因為這意味着貨幣必須在數據庫中具有復合 {Id, IdCountry} PK,這將違反能夠分配一種貨幣的要求到多個國家。

是否有解決方案可以在貨幣和國家/地區(或其他方式)之間建立關系,該關系不會使用導航屬性污染域並允許將相同的 CLR 對象用作域和 EF 實體?

我正在嘗試將 EF Core 5 實體用作 DDD 意義上的域實體。

EF 實體代表所謂的數據模型,它通常與域/業務模型不同,有自己的需求/建模規則,與其他模型不同,導航屬性是很好的關系表示,允許生成不同類型的查詢而無需使用手動連接等。

因此,通常您應該使用單獨的模型並在需要時在兩者之間進行映射,從而不會“污染”您的域模式或違反其規則。 就像您遵循域模型規則一樣,您應該遵循數據模型規則 - 我不明白為什么人們認為 EF 應該遵循他們的規則而不是遵循 EF 規則。


無論如何,話雖如此,雖然非常有用,但 EF Core 導航屬性不是強制性的(除了目前通過隱式連接實體和跳過導航的多對多) - 您可以同時擁有兩者,只是主體,只是依賴或什至都沒有結束.

您所需要的只是定義與正確的Has / With對的關系。 正確意味着在存在時使用傳遞導航屬性,並在不存在時省略它。

在這種情況下,你可以使用這樣的東西:

modelBuilder.Entity<Country>()
    .HasOne(e => e.Currency) // reference navigation property
    .WithMany() // no collection navigation property
    .IsRequired(); // omit this for optional relationship (to allow null FK)

如果從另一端開始配置,也可以達到同樣的效果。 在這種情況下,您必須明確提供泛型類型參數,因為它無法自動推斷:

modelBuilder.Entity<Currency>()
    .HasMany<Country>() // no collection navigation property
    .HasOne(e => e.Currency) // reference navigation property
    .IsRequired(); // omit this for optional relationship (to allow null FK)

您可以使用任何一種方式,只是不要同時使用兩者,因為它是同一個關系,因此應該只配置一次以避免配置沖突(如果使用單獨的IEnityTypeConfiguration<TEntity>類並不真正適合關系很好 - 一種關系有兩端)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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