2013-03-07 93 views
8

我有3个表,实体框架添加记录到多对多映射表

1)客户(ID,姓名,血乳酸血乳酸)

2)CustomerGroups(的GroupId,组名)

3 )CustomerInGroups(CustomerId,GroupId)

using (var context = DataObjectFactory.CreateContext()) 
{     
    context.Customers.Add(entity); 
    context.SaveChanges(); 
    return entity.Id; 
} 

如何将记录添加到CustomerInGroups中?的EntityFramework不会产生这样的许多一对多的映射表

实体

编辑:

无论是在客户ID列和CustomerGroups被设置为自动增量。

所以在我CustomersGroup表,我有

Id   Name 
---------------------------- 
1   Normal 
2   VIP 

我试着这样做的海报的一个建议:

entity.CustomerGroups = new List<CustomerGroup> 
{ 
    new CustomerGroup {Id = 2 } 
}; 
context.Customers.Add(entity); 
context.SaveChanges(); 
return entity.Id; 

但是,我这样做的时候,而不是建立在一个记录映射表如下:

CustomerId   GroupId 
---------------------------- 
1     2 

我得到的是

CustomerInGroups 
    CustomerId   GroupId 
    ---------------------------- 
    1     3 

CustomerGroups 
    Id   Name 
    ---------------------------- 
    1   Normal 
    2   VIP 
    3   NULL 

它实际上创造了我的CustomerGroups表,这是不是我想要

+1

实体框架在您将客户分配给组时是否不会自动更新连接表?如果连接没有有效负载(即,仅连接外键) – Daniel 2013-03-07 04:21:15

回答

7

飞有点盲目的另一个入口,因为你不包括哪些属性entity了。但你应该有一个关系CustomerGroups的财产。只需将该属性与您想要关联的组相关联即可。例如,这将创建一个新的组名称“foo bar”并将该实体与该组相关联。

using (var context = DataObjectFactory.CreateContext()) 
{ 
    entity.CustomerGroups = new List<CustomerGroup> { GroupName = "Foo bar" }; 
    context.Customers.Add(entity); 
    context.SaveChanges(); 
    return entity.Id; 
} 

如果关系设置正确,EF会自动插入记录CustomerGroups,并插入一个关系到CustomerInGroups表。

编辑:

如果你想在现有CustomerGroup添加到新的客户。您需要先从数据库获取CustomerGroup,然后将其添加到您要插入的Customer实体。

using (var context = DataObjectFactory.CreateContext()) 
{ 
    var customerGroups = context.CustomerGroups.Where(...).ToList(); // get your CustomerGroup object(s) here, and ensure it's enumerated with ToList() 
    entity.CustomerGroups = customerGroups; 
    context.Customers.Add(entity); 
    context.SaveChanges(); 
    return entity.Id; 
} 
+0

这不适用于我,您不需要创建单独的实体。它在我的组表中创建了另一条记录 – 2013-03-07 08:51:46

+0

@PapyrusBit编辑我的答案以允许已经创建“CustomerGroup”。因此,您可以与来自客户的现有“CustomerGroup”相关联。 – 2013-03-07 15:16:34

+0

@StevenV尽管我在第二个实体存在的时候遵循了你正在做的事情,但它仍然为我创造了一个新记录:( – Ciwan 2014-04-26 13:03:16

2

如果你想assing的现有客户的_existing组和假设CustomerGroup对象公开的ICollection的执行以下操作:

(var context = DataObjectFactory.CreateContext()) 
{ 
    context.Customers.Add(entity); 
    var group = context.CustomerGroups.Find(2); // or however you retrieve the existing group 
    group.Customers.Add(entity); 
    context.SaveChanges(); 
    return entity.Id 
} 

的find()方法是实体框架代码优先(DbContext)通过Id查找的方式。我不记得我的头顶是“正确的”ObjectContext的方式,但是.single(g => g.Id == 2)也可以。

理想情况下,您可以更好地了解您的实体是如何映射的,因此我们知道您如何关联实体。

+0

我正在做上述所有事情,但它仍然在数据库中创建新记录!即使我告诉它使用现有记录并形成关系在新实体和新记录之间! – Ciwan 2014-04-26 13:02:12

+0

@Ciwan是否发布了一个新问题?根据您的评论很难回答。作为指导,请确保您没有将任何现有实体添加回任何EF上下文集合。 – Daniel 2014-04-29 03:30:44

1

除了@ Steven-v的回答,如果您以前提取了客户组,并且您不想从数据库中再次获取它们,那么您也可以将它们附加到上下文中。

foreach (var c in customer.CustomerGroups) 
{ 
    _db.CustomerGroups.Attach(c); 
}   
_db.Customer.Add(customer); 
_db.SaveChanges();