2011-12-20 35 views
0

好的,因爲上次在這裏的每個人都有很大的幫助,所以我回來了。基本前提是:MVC同一父實體的多個集合

一個人可以對其他人負責。

我已經定義的實體是這樣的:

public class Person 
{ 
    public int PersonId { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Responsibility> Responsibilities { get; set; } 
} 

public class Responsibility 
{ 
    public int ResponsibilityId { get; set; } 
    public string ResponsibilityType { get; set; } 
    public virtual ICollection<Person> People { get; set; } 
} 

然而,當我添加有責任的人,他們最終與責任在自己,甚至在人們爲空時,我的責任添加到人。

另外,如果我添加責任人,一種用於人B,然後人員B顯示爲具有用於個人A一責任:

人A - 爲人物A,人物乙 人員B職責 - 職責對於人B,人A

任何想法我做錯了什麼?

UPDATE

這是我分配到DB

// 7. Responsability (Line Manager) 
       List<Person> people = new List<Person>(); 

       people.Add(personB); 

       var responsibility = new Responsibility() { Type = ResponsibilityType.LineManager, People = people }; 

       List<Responsibility> responsibilities = new List<Responsibility>(); 

       responsibilities.Add(responsibility); 

       // 7.1 Assign to Person A 
       personA.Responsibilities = responsibilities; 

       db.SaveChanges(); 

仍然導致其LineManger過的人物的人物和具有LineManager過的人物和PersonB

最新的更新

某乙和某乙

當我調用db.SaveChanges()時似乎是個問題,因爲在此之前它是完全正確的。 :(

+0

認爲這是下跌對實體您的導航性能。可以這樣想:當你將一個責任添加到一個人時,你現在可以從個人到責任或從Respibility到個人。一個人有責任的收集和責任有一個人的集合。目前沒有什麼可以說這是一種不同類型的「人」。添加一個PersonType(可能是enum),然後修改你的導航,這樣你就可以去People-> Resp-> RespPeople。這應該工作。 – BlueChippy 2011-12-20 09:25:44

+0

您使用POCO(列出的普通舊clr對象)還是實體框架? – BlueChippy 2011-12-20 10:26:02

+0

檢查您的Id屬性以及它從數據庫獲得的值。我的猜測是它沒有被設置(因此它是int默認爲0),或者被設置爲相同的一切。 – BlueChippy 2011-12-20 11:17:54

回答

0

POCO版本 - 我的作品使用類 注:我只加列表<>因爲我懶,其中的ICollection <>將工作一樣好

public class Person 
{ 
    public int PersonId { get; set; } 
    public string Name { get; set; } 
    public virtual List<Responsibility> Responsibilities { get; set; } 
} 

public class Responsibility 
{ 
    public int ResponsibilityId { get; set; } 
    public string ResponsibilityType { get; set; } 
    public virtual List<Person> People { get; set; } 
} 

static void Main(string[] args) 
{ 
    var m = new Person { PersonId = 1, Name = "Mr Manager"}; 
    var r1 = new Person { PersonId = 2, Name = "Mr ReportsToManager"}; 
    var r2 = new Person { PersonId = 3, Name = "Mrs ReportsToManager"}; 

    var resp = new Responsibility 
    { 
     ResponsibilityId = 1, 
     ResponsibilityType = "Manages", 
     People = new List<Person>() { r1, r2 } 
    }; 

    m.Responsibilities = new List<Responsibility>() { resp }; 

    m.Responsibilities.First().People.ForEach(r => Console.WriteLine(r.Name)); 

} 

Mr ReportsToManager 
Mrs ReportsToManager 
+0

似乎沒有爲我工作,仍然在數據庫中獲得兩個條目 將在下面發佈完整的代碼 – user1094145 2011-12-20 10:49:46

+0

更新的主要項目。感謝您的幫助。 – user1094145 2011-12-20 10:55:15

+0

不用擔心:)這裏的每個人都幫助過我,我們很樂意提供幫助。 – BlueChippy 2011-12-21 05:34:49

0

使用EF4! ,只是很略有不同,但相同的結果。

EF Diagram

static void Main(string[] args) 
    { 
     var m = new Person { Id = 1, Name = "Mr Manager"}; 

     var r1 = new Person { Id = 2, Name = "Mr ReportsToManager"}; 
     var r2 = new Person { Id = 3, Name = "Mrs ReportsToManager"}; 

     var resp = new Responsibility 
     { 
      Id = 1, 
      ResponsibilityType = "Manages", 
     }; 
     resp.People.Add(r1); 
     resp.People.Add(r2); 

     m.Responsibilities.Add(resp); 

     m.Responsibilities.First().People.ToList().ForEach(r => Console.WriteLine(r.Name)); 

    } 

Mr ReportsToManager 
Mrs ReportsToManager 
0

檢查您實體的Id屬性 - 它們應該與此類似。

您還需要檢查Db爲該列設置的內容。使其成爲主鍵和標識列。

檢查調用保存後,你實際上有3人,並使用SQL來獲得相同的實體關係。

Id Properties

+0

我可以在POCO模型上做到這一點嗎? – user1094145 2011-12-20 12:01:03

+0

如果它的POCO,然後檢查您的數據庫,看看什麼是設置和PK/FK的設置。 – BlueChippy 2011-12-21 05:34:12

相關問題