2013-10-09 74 views
0

我正在試驗EF5 Code First,我正在使用模型(如下所示)。實體框架代碼第一關係;我錯過了什麼?

當我看到創建的數據庫時,我很困惑,因爲我沒有看到Track表中指向Category表的任何內容。類別有一個FK指向追蹤,但這意味着將有類別的重複?

有點背景:我正在試圖建立一個有軌道的模型,每個軌道可以有1到N個分類。所有的類都已經定義好了,那就是它們基本上是查找的,我打算在創建數據庫時在種子方法中創建它們。

我覺得我不明白一些明顯的東西......當我查詢一首曲目時,我將如何知道它包含的是什麼類別?

THX

public class Track : IAuditInfo 
{ 
    public Int32 Id { get; set; } 
    public String Name { get; set; } 
    public String Description { get; set; } 
    public String Data { get; set; } 
    public DateTime CreatedOn { get; set; } 
    public DateTime ModifiedOn { get; set; } 

    public ICollection<Category> Categories { get; set; } 

    public Track() 
    { 
     Categories = new List<Category>(); 
    } 
} 

public class Category 
{ 
    public Int32 Id { get; set; } 
    public Boolean IsVisible { get; set; } 
    public String DisplayName { get; set; } 
} 
+0

難道你沒有一個表「軌道分類」(或類似),結合這兩個? –

+0

'Category'將會有一個'TrackId'。一個'Track'有很多'Categories'。問題是什麼? –

+0

不,這可能是我的問題...我想我需要閱讀更多,因爲我完全錯過了。 – user2864862

回答

1

您當前的模型是軌道和類別之間的一個一對多的關係。 正如你所注意到的那樣,這個通常被實現,實體框架的確在一邊(軌道)的多邊(類別)上使用外鍵。

如果我理解正確,你想要的是多對多的關係。許多曲目可能與同一類別相關,並且單個曲目可能屬於許多類別。

爲了讓實體框架明白你想要一個多對多的關係,你可以簡單地將一個ICollection屬性添加到你的類別類中。 所以你的兩個類都應該有另一個類的集合。 也就是說曲目有很多類別和類別都有很多曲目。

欲瞭解更多信息,您還可以看到:http://msdn.microsoft.com/en-us/data/hh134698.a.nospx

0

奧拉夫是正確的,此刻你的數據模型是不會告訴實體框架,有在那裏一個多到多的關係。

解決這個最簡單的方法是

public virtual ICollection<Track> Tracks { get; set; } 

添加到您的Category類。

但是...您可能不想污染與您的域無關的人爲因素的域模型。更重要的是,當你這樣做時,由Entity Framework決定要調用綁定表的內容。在EF6之前,這個命名是非確定性(參見http://entityframework.codeplex.com/workitem/1677),這可能意味着編譯相同代碼的兩臺不同機器將決定該表的不同名稱,並在您的生產系統中導致一些有趣的遷移問題。

這兩個問題的答案是始終顯式地管理與Fluent配置的多對多關係。

在數據上下文類,覆蓋OnModelCreating,像這樣:

public class MyDb : DbContext 
{ 
    public IDbSet<Track> Tracks { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Track>() 
      .HasMany(t => t.Categories) 
      .WithMany() 
      .Map(c => c.ToTable("CategoriesForTracks")); 
    } 
} 

如果你這樣做,你需要一個導航屬性添加到您的範疇類,但你仍然可以(如果你這樣做,你應該使用WithMany的重載,允許你指定一個屬性)。

實體之間的關係以及如何將其映射到關係數據庫本質上很難。對於除了最簡單的父子關係以外的其他任何事情,您都希望使用流暢的API來確保實際獲得所需內容。

莫爾塔扎Manavi在EF代碼首先進行詳盡一個really good blog series描述關係。

注意 你通常應該使導航性能虛擬。所以,你應該改變你的Category類是這樣的:

public virtual ICollection<Category> Categories { get; set; } 

從理論上講,沒有把它虛擬應該只是導致預先加載,而不是延遲加載的情況發生。在實踐中,當我的導航屬性不是虛擬時,我總是發現很多細微的錯誤。

相關問題