У меня проблема с Entity Framework в Asp.net. Я хочу получить значение Id всякий раз, когда я добавляю объект в базу данных. Как я могу это сделать?
c#
entity-framework
entity
Ahmet
источник
источник
SaveChanges
прямо сейчас, чтобы получить удостоверение личности. Дальнейшее чтение здесь .Ответы:
Это довольно легко. Если вы используете DB генерируется Идентификаторы (например ,
IDENTITY
в MS SQL) вам просто нужно добавить объект кObjectSet
иSaveChanges
на связанныеObjectContext
.Id
будет автоматически заполнено для вас:Рамки Entity по умолчанию следует каждый
INSERT
с ,SELECT SCOPE_IDENTITY()
когда автоматически генерируемыеId
используются s.источник
Я использовал ответ Ладислава Мрнки для успешного получения идентификаторов при использовании Entity Framework, однако я публикую здесь, потому что я его не использовал (т. Е. Использовал там, где это не требовалось) и думал, что я опубликую свои выводы здесь, Если люди хотят «решить» проблему, которая у меня была.
Рассмотрим объект Заказа, который имеет отношение внешнего ключа с Клиентом. Когда я добавил нового клиента и новый заказ одновременно, я делал что-то вроде этого;
Однако в моем случае это не требовалось, потому что у меня были отношения внешнего ключа между customer.Id и order.CustomerId
Все, что мне нужно было сделать, это;
Теперь, когда я сохраняю изменения, идентификатор, который генерируется для клиента, также добавляется в заказ. Мне не нужны дополнительные шаги
Я знаю, что это не отвечает на первоначальный вопрос, но я подумал, что это может помочь разработчикам, которые плохо знакомы с EF, чрезмерно использовать ответ с верхним голосом для чего-то, что может не потребоваться.
Это также означает, что обновления завершаются за одну транзакцию, что может привести к потере данных о потерях (либо все обновления завершены, либо нет).
источник
Вам необходимо перезагрузить объект после сохранения изменений. Потому что он был изменен триггером базы данных, который не может быть отслежен EF. Так что нам нужно перезагрузить сущность снова из БД,
затем
Посмотрите на ответ @jayantha в следующем вопросе:
Как я могу получить идентификатор вставленной сущности в Entity Framework при использовании defaultValue?
Поиск @христианского ответа в следующем вопросе тоже может помочь:
Entity Framework Обновить контекст?
источник
.GetDatabaseValues();
если вы просто сохранили свою модель в БД. Идентификатор должен автоматически заполнить модель.GetDatabaseValues()
если он не знает идентификатор объекта, который нужно искать в базе данных?Пожалуйста, обратитесь по этой ссылке.
http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/
Вы должны установить свойство StoreGeneratedPattern в идентичность и затем попробовать свой собственный код.
Или вы также можете использовать это.
источник
StoreGeneratedPattern
был недостающий кусок для меня.Сохраняемый объект должен иметь правильный
Id
после распространения изменений в базе данных.источник
Вы можете получить идентификатор только после сохранения, вместо этого вы можете создать новый Guid и назначить перед сохранением.
источник
Я сталкиваюсь с ситуацией, когда мне нужно вставить данные в базу данных и одновременно потребовать первичный идентификатор, используя структуру сущностей. Решение :
источник
Все ответы очень хорошо подходят для их собственных сценариев, но я отличался тем, что назначил int PK непосредственно из объекта (TEntity), который Add () возвратил в переменную int, подобную этой;
поэтому вместо создания нового объекта вы просто берете то, что хотите :)
РЕДАКТИРОВАТЬ Для г-на @GertArnold:
источник
Add
(если это такDbSet.Add
) не магическим образом присваивает значениеEmployeeId
.SaveChanges
. Невозможно. Если у вас нет другого процесса, который присваиваетEmployeeId
, например, вEmployee
конструкторе. ИЛИ вы используете ядро EFForSqlServerUseSequenceHiLo
. Во всяком случае, вы не даете всю картину.Это будет работать
источник
Repository
такое. И «это сработает» - какое-то объяснение!Есть две стратегии:
Использовать базу данных
ID
(int
илиGUID
)Минусы:
Вы должны выполнить,
SaveChanges()
чтобы получитьID
только что сохраненные объекты.Плюсы:
Можно использовать
int
личность.Использовать сгенерированный клиент
ID
- только GUID.Плюсы: минимизация
SaveChanges
операций. Возможность вставлять большой граф новых объектов за одну операцию.Минусы:
Разрешено только для
GUID
источник
При первом использовании кода EF 6.x
и инициализировать таблицу базы данных, он поместит
в свойствах таблицы под заголовком «Значение по умолчанию» или «Связывание», позволяя заполнять идентификатор при его вставке.
Проблема в том, что если вы создадите таблицу и добавите
часть позже, будущие update-database не добавят обратно (newsequentialid ())
Чтобы исправить это, нужно стереть миграцию, удалить базу данных и перенастроить ... или вы можете просто добавить (newsequentialid ()) в конструктор таблиц.
источник
when -column- is NULL, then NEWID()