如果你看看在EntityTypeConfiguration<TEntityType>
類,你會看到下面的簽名用於定義一個一對多的關係(這是Team
和BirthYears
之間的關係):
HasMany<TTargetEntity>(Expression<Func<TEntityType, ICollection<TTargetEntity>>>
navigationPropertyExpression) where TTargetEntity : class;
正如你所看到的,存在約束where TTargetEntity : class
,其要求BirthYears
是class
對象的集合。 int
不是一個類,所以映射將不可能。
我能看到的唯一的解決方法是定義一個小類...
public class BirthYear
{
public int Id { get; set; }
public int Value { get; set; }
}
...然後在您的收藏類中的團隊使用:
public ICollection<BirthYear> BirthYears { get; set; }
映射約定應自動創建一對多關係,以便您不需要Fluent API來建立關聯。
編輯
根據意見拉吉斯拉夫的正確批評糾正:
類BirthYear
需要額外的關鍵屬性。我已添加屬性Id
。我想BirthYears
將依賴Team
屬性。映射約定將創建從BirthYear
到Team
的可選關係。我認爲這將是更適合的模型進行使用流利的API需要這種關係:
modelBuilder.Entity<Team>()
.HasMany(t => t.BirthYears)
.WithRequired();
這將自動啓用級聯刪除 - 關聯BirthYears會從數據庫中當一支球隊被刪除被刪除。
編輯2
(同樣基於拉吉斯拉夫的評論)如果您不希望複製這些年來在BirthYears表,你也可以設置一個許多一對多的關係:
modelBuilder.Entity<Team>()
.HasMany(t => t.BirthYears)
.WithMany();
這將在數據庫中添加Team
和BirthYear
之間的連接表(TeamBirthYears
)。從存儲空間或性能的角度來看,您不可能贏得任何東西(因爲BirthYear
類非常小,並且BirthYear
表中的記錄與連接表中的記錄具有相同的大小)。但是,如果您想要遲早通過其他屬性擴展BirthYear
類,它可能會是更好的方法。否則,我會親自保持一對多關係簡單。但選擇是你的。
這會引發異常。 'BirthYear'必須有另一個財產將被用作PK。同樣,一旦您將「生日」作爲單獨的實體關係展開,很可能會重複出現多對多或出生年份。 – 2011-04-06 21:44:14
@拉迪斯拉夫:沒錯,這是一個太馬虎的答案,謝謝你的提示!我現在糾正了它。但是你什麼時候意味着會發生多對多的關係?我現在做了一個小測試,它似乎是一對多的關係 - 可選,沒有上面的Fluent代碼,並且需要使用此代碼。 – Slauma 2011-04-06 22:30:29
這是一對多的,但如果我理解這種情況,它應該可能是多對多的,否則在BirthYear中可以有許多記錄具有相同的值。 – 2011-04-06 22:47:32