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