2013-02-17 57 views
1

我是否必須創建一個POCO類來表示多對多關係中的連接表?EF5多對多連接表流利API

這是我的情景:

public class Event 
{ 
    public int EventId { get; set; } 
    public int OrganizerId { get; set; } 
} 

public class Person 
{ 
    public int PersonId { get; set; } 
    ICollection<Event> Events { get; set; } 
} 

public class Company 
{ 
    public int CompanyId { get; set; } 
    ICollection<Event> Events { get; set; } 
} 

無論一個人或一個公司可以組織一個事件,我想創建一個連接表像

Table Events_People 
PersonId 
OrganizerId 


Table Events_Companies 
CompanyId 
OrganizerId 

我知道,應該很容易做到,如果我創建了兩個POCO類,如

public class EventPerson 
{ 
    public int EventId { get; set; } 
    public Person PersonId { get; set; } 
} 

比用Fluent API有點像

modelBuilder.Entity<Person>() 
// PK 
.HasKey(e => e.PersonId) 
// FK 
.HasMany(e => e.Events) 
.WithRequired(e => e.PersonId); 

有沒有辦法避免兩個POCO,並直接告訴API來創建連接表? 謝謝

回答

1

你可以用EF做多到多的。更大的問題是這是一個好主意。例如,如果您需要或需要,您可能會發現級聯刪除存在問題。如果您最終得到2個與同一個實體(不一定是您的特定示例代碼)所需的關係,但與您的問題更一般地匹配,那麼除非使用WillCascadeOnDelete(false),否則可能會出現EF編譯/運行時錯誤。以防人們想到,所以你可以這樣做。 Becareful。:-)

但是你問你能告訴EF創建一個連接

你沒看到EF產生一個連接表?我會預料到的。我好奇爲什麼不。

你可以明確地對其進行管理:

HasMany(t => t.NavigationProperty1) 
.WithMany(a => a.ReverseNavigationProperty) 
.Map(c => c.ToTable("TheJoinTable")); 



// rename keys as required, may not be required... 
c.MapLeftKey("ColumnKeyName"); 
c.MapRightKey("ABetterName2"); 

BTW你的建議的例子正是需要避開一些CascadeOnDelete問題的模式。

+0

呃..對,我知道我可以得到一些問題,但我怎樣才能以不同的方式解決問題?我認爲連接表是最佳選擇 – Davide 2013-02-17 19:06:09

+0

ps。我很想成爲一名dba,但如果我沒有錯,在我的情況下,我不想啓用級聯刪除 – Davide 2013-02-17 19:21:34

+1

對不起,沒有試圖混淆或咆哮。我被燒了這個問題,它需要一段時間來解決許多表和許多relatioships。當然,如果不使用級聯刪除所有的好:-D – 2013-02-17 22:43:32