c# - книга - entity framework пример




Как я могу получить идентификатор вставленного объекта в инфраструктуре Entity? (8)

У меня проблема с Entity Framework в Asp.net. Я хочу получить значение Id, когда я добавляю объект в базу данных. Как я могу это сделать?


Вам необходимо перезагрузить объект после сохранения. Потому что он был изменен с помощью триггера базы данных, который не может быть отслежен EF. Итак, нам нужно перезагрузить объект снова из БД,

db.Entry(MyNewObject).GetDatabaseValues();

затем

int id = myNewObject.Id;

Посмотрите на @jayantha ответ в следующем вопросе:

Как я могу получить идентификатор вставленного объекта в инфраструктуре Entity при использовании defaultValue?

Глядя на @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 после распространения изменений в базе данных.


Существует две стратегии:

  1. Использовать ID базы данных ( int или GUID )

    Минусы:

    Вы должны выполнить SaveChanges() чтобы получить ID только для сохраненных объектов.

    Плюсы:

    Может использовать идентификатор пользователя.

  2. Использовать только идентификатор клиента - только 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;

Это сработает.





entity