2015-03-13 63 views
2

我使用實體框架與Code First創建數據庫等。如何首先需要與代碼的多對多關係

public class Company : Entity // Entity contains an ID and a RowVersion 
{ 
    // some Properties 
    // 
    public virtual ICollection<Profile> Profiles { get; set; } 
} 

// No Attributes here, because this Model has to be reusable 
public class Profile : Entity 
{ 
    // some Properties 
    // 
    public virtual ICollection<Company> Companies { get; set; } 
} 

我想要求公司擁有一個用於管理該公司的配置文件(cn:n)。我有一些負責編輯實體的「業務邏輯」,主要是因爲驗證部分。邏輯會驗證是否設置了所需的關係。我在這裏有兩個問題:

DB應該有可選關係(用於編輯方便)嗎? 「業務邏輯」必須是唯一編輯數據庫的人員。

或者我會如何設置所需的關係?


我不介意,如果你有一點當然,在我看來,與EF在互聯網上的多對多關係太少了。 (我是新來的,所以從來不介意,如果這違背一些規則)


編輯 我所知道的與第三個表的方式,但是這是我的觀點:How to require many to many relation with code first

+0

你有沒有想過創建第三實體搞定N:N的關係? – 2015-03-13 14:27:32

+0

@Guillelon是的,我有,那將是緊急的選擇。但是,代碼的第一點是你不必關心數據庫如何執行它,你只關心類。以這種方式,沒有任何其他屬性的第三類(加上另外三個關係類,我有很多多對多的關係)不會是理想的。 – lukee910 2015-03-13 14:33:20

回答

2

您需要通過實現IValidatableObject接口將您的實體變爲可驗證對象,並使用一種方法檢查集合中是否至少有一個項目。該方法被稱爲EF當你打電話SaveChanges()

public class Company : Entity, IValidatableObject 
{ 
    public virtual ICollection<Profile> Profiles { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (!Profiles.Any()) 
      yield return new ValidationResult("Company must have at least 1 Profile"); 
    } 
} 

public class Profile : Entity, IValidatableObject 
{ 
    public virtual ICollection<Company> Companies { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (!Companies.Any()) 
      yield return new ValidationResult("Profile must have at least 1 Company"); 
    } 
} 

參考:IValidateableObject example

3

當出現這種情況時(多對多)設計數據庫時,請使用附加表來區分這一點。例如,我們有兩個表t1和t2,其中t1從多到多到t2,創建一個相關的表t3: t1一對多到t3和t2一對多t3。

在你的情況,你需要創建一個額外的類,像這樣:

public class CompanyProfile { 
    public virtual ICollection<Company> Companies { get; set; } 
    public virtual ICollection<Profile> Profiles { get; set; } 
} 

在你classees公司和個人信息的鏈接公司簡介類。

+0

你是對的,但也[那](http://stackoverflow.com/questions/29034357/how-to-require-many-to-many-relation-with-code-first?noredirect=1#comment46310537_29034357) 。 - >在問題編輯 – lukee910 2015-03-13 14:36:29

+0

@LukasDörig好吧,我通常用這種方式來解決我的任務。我不知道,但也許這可以幫助你:https://msdn.microsoft.com/en-us/data/jj591620.aspx#ManyToMany – netwer 2015-03-13 14:42:55

+2

@netwer爲什麼列表的元素?而不是ElementId? – adricadar 2015-03-13 14:45:35

相關問題