2011-04-06 50 views
4

我有這個性質我的課:團隊如何保存的ICollection <int>與EF CTP5

[Key] 
public virtual long Id { get; set; } 

public Guid ClubIdentifier { get; set; } 
public GenderEnum Gender { get; set; } 
public TeamAgeCategoryEnum TeamAgeCategory { get; set; } 
public ICollection<int> BirthYears { get; set; } 

我怎樣才能在財產BirthYears內容保存到我的數據庫,我讓EF基於創建我的數據庫在模型上,但屬性BirthYears被遺漏在我的數據庫中。我會期待一個新的表,它保存int值和我的團隊ID值。

我錯過了什麼,我想我需要在存儲庫類中做一些O​​nModelCreating方法。

回答

5

如果你看看在EntityTypeConfiguration<TEntityType>類,你會看到下面的簽名用於定義一個一對多的關係(這是TeamBirthYears之間的關係):

HasMany<TTargetEntity>(Expression<Func<TEntityType, ICollection<TTargetEntity>>> 
    navigationPropertyExpression) where TTargetEntity : class; 

正如你所看到的,存在約束where TTargetEntity : class,其要求BirthYearsclass對象的集合。 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屬性。映射約定將創建從BirthYearTeam的可選關係。我認爲這將是更適合的模型進行使用流利的API需要這種關係:

modelBuilder.Entity<Team>() 
      .HasMany(t => t.BirthYears) 
      .WithRequired(); 

這將自動啓用級聯刪除 - 關聯BirthYears會從數據庫中當一支球隊被刪除被刪除。

編輯2

(同樣基於拉吉斯拉夫的評論)如果您不希望複製這些年來在BirthYears表,你也可以設置一個許多一對多的關係:

modelBuilder.Entity<Team>() 
      .HasMany(t => t.BirthYears) 
      .WithMany(); 

這將在數據庫中添加TeamBirthYear之間的連接表(TeamBirthYears)。從存儲空間或性能的角度來看,您不可能贏得任何東西(因爲BirthYear類非常小,並且BirthYear表中的記錄與連接表中的記錄具有相同的大小)。但是,如果您想要遲早通過其他屬性擴展BirthYear類,它可能會是更好的方法。否則,我會親自保持一對多關係簡單。但選擇是你的。

+1

這會引發異常。 'BirthYear'必須有另一個財產將被用作PK。同樣,一旦您將「生日」作爲單獨的實體關係展開,很可能會重複出現多對多或出生年份。 – 2011-04-06 21:44:14

+0

@拉迪斯拉夫:沒錯,這是一個太馬虎的答案,謝謝你的提示!我現在糾正了它。但是你什麼時候意味着會發生多對多的關係?我現在做了一個小測試,它似乎是一對多的關係 - 可選,沒有上面的Fluent代碼,並且需要使用此代碼。 – Slauma 2011-04-06 22:30:29

+0

這是一對多的,但如果我理解這種情況,它應該可能是多對多的,否則在BirthYear中可以有許多記錄具有相同的值。 – 2011-04-06 22:47:32