2011-12-20 16 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; } 
} 

はしかし、私は人に責任を追加するとき、彼らは自分たちの上に責任をもって終わる、でも人々に空であります。

Iが人物Bのための人物Aに責任を追加する場合も、その人物Bが人物Aの責任を有するものとして現れる:

人物A - 人物Aのための責任、人物B 人物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人物Bおよび人物Bペルソナ上LineManagerを有するPersonB

最新の更新を有する個人をもたらすさ

私はdb.SaveChanges()を呼び出すときに問題があると思われます。その前にはまったく正しいためです。 :(

+0

これは、エンティティのナビゲーションプロパティに依存します。それを次のように考えてみましょう。PersonにResponsibiliyを追加すると、現在PersonからResponsibilityに、またはResposibilityからPersonに移動できます。人には責任のコレクションがあり、責任には人の集まりがあります。現在のところ、これは "人"の別のタイプであるとは言いません。 PersonTypeを追加して(恐らくenum)、ナビゲーションを修正してPeople-> Resp-> RespPeopleに行くことができます。これはうまくいくはずです。 – BlueChippy

+0

POCO(記載されているプレーンな古いclrオブジェクト)またはEntity Frameworkを使用していますか? – BlueChippy

+0

Idプロパティとその値をDBから取得します。私の推測では、その設定されていない(したがって、それはintのデフォルト値は0)か、すべて同じものに設定されています。 – BlueChippy

答えて

0

POCOバージョン - あなたのクラスを使用して私の作品 注:私だけ追加リスト<>のICollectionを<>が同じようにうまく動作する場所私は怠け者だからEF4を使用して

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

私にとってはうまくいかないようですが、依然としてDBに2つのエントリーがあります 下記のフルコードを投稿します – user1094145

+0

メインアイテムを更新しました。途中で助けてくれてありがとう。 – user1094145

+0

心配しない:)ここにいる皆さんが私を助けてくれました。私たちは助けてうれしいです。 – BlueChippy

0

。! 、ちょうど非常にわずかに異なるが、同じ結果。

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が列に対して設定した内容を確認することもできます。これを主キーとID列にします。

実際に3人の人がいるというセーブを呼び出した後にチェックし、SQLを使用して同じエンティティ関係を取得します。

Id Properties

+0

POCOモデルでこれを行うことはできますか? – user1094145

+0

そのPOCOがあなたのDBをチェックして、何が設定されているか、PK/FKが何に設定されているかを確認します。 – BlueChippy

関連する問題