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();