Entity Framework adding record into many to many mapping table

末鹿安然 提交于 2019-12-29 05:23:22

问题


I have 3 tables,

1) Customer (Id, Name, bla bla)

2) CustomerGroups (GroupId, GroupName)

3) CustomerInGroups (CustomerId, GroupId)

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

How do I add a record into CustomerInGroups? EntityFramework doesn't generate entities for such many-to-many mapping tables

Edit:

Both the Id columns in Customer and CustomerGroups are set to auto increment.

So in my CustomersGroup table, I have

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

I tried doing this as one of the posters suggested:

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

However, when I did this, instead of creating a record in the mapping table like this:

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

What I got was

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

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

It actually created another entry in my CustomerGroups table, which is not what I want


回答1:


Flying a little blind since you didn't include what properties entity has. But you should have a property for the relationship to CustomerGroups. Just set that property with the groups you want to be related to. For example, this would create a new Group name "foo bar" and relate the entity to that group.

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

If the relationship is setup correctly, EF will automatically insert a record into CustomerGroups and insert a relationship into the CustomerInGroups table.

EDIT:

If you're trying to add an existing CustomerGroup to a new Customer. You'll want to get the CustomerGroup from the database first, then add it to the Customer entity you're inserting.

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;
}



回答2:


If you are trying to assing an existing customer to an _existing group and assuming that the CustomerGroup object exposes an ICollection do the following:

(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
}

The Find() method is Entity Framework Code First (DbContext) way of finding by Id. I can't remember of the top of my head the "proper" ObjectContext way of doing it but but .Single(g => g.Id == 2) would also work.

Ideally you'd give us a better idea of how your entities are mapped so we know how you are relating your entities.




回答3:


In Addition to @Steven-v's answer, If you previously fetched customer groups and you don't want to fetch them again from db, you also can just attach them to the context.

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


来源:https://stackoverflow.com/questions/15262974/entity-framework-adding-record-into-many-to-many-mapping-table

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!