c# - книга - entity framework пример
Как я могу получить идентификатор вставленного объекта в инфраструктуре Entity? (8)
У меня проблема с Entity Framework в Asp.net. Я хочу получить значение Id, когда я добавляю объект в базу данных. Как я могу это сделать?
Вам необходимо перезагрузить объект после сохранения. Потому что он был изменен с помощью триггера базы данных, который не может быть отслежен EF. Итак, нам нужно перезагрузить объект снова из БД,
db.Entry(MyNewObject).GetDatabaseValues();
затем
int id = myNewObject.Id;
Посмотрите на @jayantha ответ в следующем вопросе:
Глядя на @christian ответ в следующем вопросе, может также помочь:
Контекст контекста Entity Framework?
Все ответы очень хорошо подходят для их собственных сценариев, что я сделал по-другому, так это то, что я назначил int PK непосредственно из объекта (TEntity), который Add () возвратил в переменную int подобно этому;
using (Entities entities = new Entities())
{
int employeeId = entities.Employee.Add(new Employee
{
EmployeeName = employeeComplexModel.EmployeeName,
EmployeeCreatedDate = DateTime.Now,
EmployeeUpdatedDate = DateTime.Now,
EmployeeStatus = true
}).EmployeeId;
//...use id for other work
}
поэтому вместо создания всего нового объекта вы просто берете то, что хотите :)
РЕДАКТИРОВАТЬ Для г-на @ Герта Арнольда:
Когда вы сначала используете код EF 6.x
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
и инициализировать таблицу базы данных, она будет
(newsequentialid())
внутри свойств таблицы в заголовке Значение по умолчанию или Связывание, позволяющее заполнять ID по мере его вставки.
Проблема в том, что вы создаете таблицу и добавляете
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
позже, будущие базы данных обновлений не будут добавлять обратно (newsequentialid ())
Правильно исправить это, чтобы стереть миграцию, удалить базу данных и перенаправить ... или вы можете просто добавить (newsequentialid ()) в конструктор таблиц.
Объект, который вы сохраняете, должен иметь правильный Id
после распространения изменений в базе данных.
Существует две стратегии:
Использовать
ID
базы данных (int
илиGUID
)Минусы:
Вы должны выполнить
SaveChanges()
чтобы получитьID
только для сохраненных объектов.Плюсы:
Может использовать идентификатор пользователя.
Использовать только идентификатор клиента - только GUID.
Плюсы: минимизация операций
SaveChanges
. Возможность вставить большой график новых объектов за одну операцию.Минусы:
Разрешено только для
GUID
Это довольно легко. Если вы используете идентификаторы сгенерированных БД (например, IDENTITY
в MS SQL), вам просто нужно добавить объект в ObjectSet
и SaveChanges
для соответствующего объекта ObjectContext
. Id
будет автоматически заполнен для вас:
using (var context = new MyContext())
{
context.MyEntities.AddObject(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Yes it's here
}
Структура Entity по умолчанию следует за каждым INSERT
с помощью SELECT SCOPE_IDENTITY()
когда используются автогенерируемые Id
.
Я сталкиваюсь с ситуацией, когда мне нужно вставлять данные в базу данных и одновременно требовать первичный идентификатор, используя структуру сущности. Решение :
long id;
IGenericQueryRepository<myentityclass, Entityname> InfoBase = null;
try
{
InfoBase = new GenericQueryRepository<myentityclass, Entityname>();
InfoBase.Add(generalinfo);
InfoBase.Context.SaveChanges();
id = entityclassobj.ID;
return id;
}
Repository.addorupdate(entity, entity.id);
Repository.savechanges();
Var id = entity.id;
Это сработает.