IMO Id нужен, даже если он сгенерирован.Предположим, что вы используете ассоциацию внешнего ключа (поведение отличается от независимой ассоциации).Это означает, что связанные дочерние объекты используют первичный ключ родительского объекта для построения отношений.Теперь предположим, что вы добавляете несколько родительских сущностей со связанными сущностями в одну единицу работы.Вы должны указать уникальный (временный) Id для каждого родительского объекта, иначе вы никогда не настроите свой граф объектов.Таким образом, генератор кода, вероятно, делает это по умолчанию.
Редактировать:
Я удивлен, что мне отказали в ответе на основе правильных фактов.Итак, позвольте мне уточнить мой ответ:
В EF 4.0 доступно два типа отношений.Независимая ассоциация и Ассоциация внешних ключей.Различие состоит в том, что последний добавляет свойства внешнего ключа к сущностям.Это позволяет вам работать с отношениями так же, как в базе данных - просто устанавливая ключи.Вы можете прочитать об этих различиях в MSDN .
Теперь давайте рассмотрим простой пример.У меня есть простая модель EDMX с MyContext.Модель состоит из двух сущностей Order и OrderLine.Когда я добавил в модель таблицы Orders и OrderLines, я выделил в столбцах столбцы внешних ключей, поэтому вместо независимых связей я использую связи внешних ключей.
В заказе хранится сгенерированный Id в качестве ключа и CustomerName в качестве свойства.,В строке заказа хранится сгенерированный Id в качестве ключа, ProductTitle в качестве свойства и OrderId в качестве внешнего ключа.Я хочу добавить два заказа в одну единицу работы:
using (var context = new MyContext())
{
var ox = Order.CreateOrder(0, "CustomerX");
var oy = Order.CreateOrder(0, "CustomerY");
// Building relationship in the same way as in database
var olx = OrderLine.CreateOrderLine(0, ox.Id, "ProductX");
var oly = OrderLine.CreateOrderLine(0, oy.Id, "ProductY");
context.Orders.AddObject(ox);
context.Orders.AddObject(oy);
context.OrderLines.AddObject(olx);
context.OrderLines.AddObject(oly);
context.SaveChanges(); // UpdateException: Unable determine principal end of Model.FK_OrderLine_Order relationship. Multiple added entities have the same primary key.
}
Ошибка, которую я сделал в своем коде, заключается в установке идентификатора обоих новых заказов на 0. Даже если это временный идентификатор, он все равно должен быть уникальным.если вы хотите использовать его для внешних ключей.Вы можете, вероятно, спросить в данный момент, почему контекст не обрабатывает Id сам по себе?Просто потому что не может.Контекст знает, что идентификатор является временным и будет восстановлен в хранилище, но контекст не знает деталей о конфигурации хранилища.Когда вы устанавливаете Identity в базе данных, вы также устанавливаете начальное и приращение.Эти два значения не известны контексту, поэтому контекст не может получить действительный уникальный временный идентификатор, который еще не используется хранилищем.Предположим, что контекст неправильно создает некоторый временный идентификатор, и после этого вы загружаете объект, который уже использует эту проблему Id =.
Если я просто обновлю свой код, чтобы использовать уникальный временный идентификатор (я знаю, как настроено хранилище), он будетРабота.Это IMO одна из причин, почему мне нужно предоставить временный идентификатор для методов Create.