2011-12-20 56 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

相关问题