Entity Framework добавление записи во многие таблицы сопоставления

у меня 3 таблицы,

1) Клиент (Id, имя, bla bla)

2) Пользовательские Группы (GroupId, GroupName)

3) CustomerInGroups (CustomerId, GroupId)

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

как добавить запись в CustomerInGroups? EntityFramework не генерирует сущности для таких таблиц сопоставления "многие ко многим"

Edit:

оба столбца Id в Customer и CustomerGroups имеют значение auto increment.

так что в моем Таблица 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, что не то, что я хочу

3 ответов


полет немного слепой, так как вы не включили какие свойства 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 таблица.

EDIT:

если вы пытаетесь добавить уже существующий 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;
}

Если вы пытаетесь 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 () - это первый способ поиска кода Entity Framework (DbContext) по идентификатору. Я не могу вспомнить о верхней части моей головы "правильный" способ ObjectContext делать это, но но .Одиночный (g => g.Id == 2) также будет работать.

В идеале вы бы дали нам лучшее представление о том, как ваши сущности отображаются, чтобы мы знали, как вы связываете свои сущности.


В дополнение к ответу @Steven-v, Если вы ранее извлекали группы клиентов, и вы не хотите извлекать их снова из БД, вы также можете просто прикрепить их к контексту.

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