Entity Framework: получить автоматически сгенерированный ключ [дубликат]

Это одно из мест, с помощью которого привязка данных, используемая во многих новых фреймворках JavaScript, будет очень полезна для вас ...

Итак, если вы используете Angular, React или любые другие фреймворки, которые делают два способа связывания данных, эта проблема просто исправлена ​​для вас, поэтому простым языком ваш результат undefined на первом этапе, поэтому вы получили result = undefined до получения данных, а затем, как только вы получите результат , он будет обновляться и присваиваться новому значению, которое отвечает на ваш вызов Ajax ...

Но как вы можете сделать это в чистом javascript или jQuery, например, как вы задали этот вопрос?

Вы можете использовать обратный вызов, обещание и недавно наблюдаемое, чтобы обрабатывать его для вас, например, в обещаниях мы имеем некоторые функции, такие как success () или then (), которые будут выполняться, когда ваши данные будут готовы для вас, с функцией обратного вызова или подписки на наблюдаемые.

Например, в вашем случае, в котором вы используете jQuery, вы можете сделать что-то вроде этого:

$(document).ready(function(){
    function foo() {
        $.ajax({url: "api/data", success: function(data){
            fooDone(data); //after we have data, we pass it to fooDone
        }});
    };

    function fooDone(data) {
        console.log(data); //fooDone has the data and console.log it
    };

    foo(); //call happens here
});

Для получения дополнительной информации n изучение обещаний и наблюдаемых, которые являются новыми способами для создания асинхронных материалов.

453
задан gunr2171 7 May 2014 в 14:00
поделиться

11 ответов

Пожалуйста, обратитесь к этой ссылке.

http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/

Вы должны установить свойство StoreGeneratedPattern для идентификации, а затем попробовать свой собственный код.

Или вы также можете использовать это.

using (var context = new MyContext())
{
  context.MyEntities.AddObject(myNewObject);
  context.SaveChanges();

  int id = myNewObject.Id; // Your Identity column ID
}
12
ответ дан Azhar Mansuri 24 August 2018 в 22:00
поделиться

Я использовал ответ Ladislav Mrnka , чтобы успешно получить идентификаторы при использовании Entity Framework, но я размещаю здесь, потому что я пропустил его (то есть использовал его там, где это не было необходимо) и подумал, что я опубликую свои выводы здесь, в случае, когда люди ищут «решить» проблему, которую я имел.

Рассмотрим объект Order, который имеет отношение внешнего ключа с Клиентом. Когда я добавил нового клиента и новый порядок одновременно, я делал что-то вроде этого:

var customer = new Customer(); //no Id yet;
var order = new Order(); //requires Customer.Id to link it to customer;
context.Customers.Add(customer);
context.SaveChanges();//this generates the Id for customer
order.CustomerId = customer.Id;//finally I can set the Id

Однако в моем случае это не требовалось, потому что у меня было отношение внешнего ключа между customer.Id и order.CustomerId

Все, что мне нужно было сделать, это:

var customer = new Customer(); //no Id yet;
var order = new Order{Customer = customer}; 
context.SaveChanges();//adds customer.Id to customer and the correct CustomerId to order

Теперь, когда я сохраняю изменения, идентификатор, созданный для клиента, также добавляется по заказу. Мне не нужны дополнительные шаги

. Я знаю, что это не отвечает на исходный вопрос, но подумал, что это может помочь разработчикам, которые не знакомы с EF, из-за использования голосового ответа для чего-то это может не потребоваться.

67
ответ дан Community 24 August 2018 в 22:00
поделиться

Все ответы очень хорошо подходят для их собственных сценариев, что я сделал по-другому, так это то, что я назначил 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
}

, поэтому вместо создания всего нового объекта вы просто берете то, что хотите:)

0
ответ дан IteratioN7T 24 August 2018 в 22:00
поделиться

Когда вы сначала используете код EF 6.x

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

и инициализируете таблицу базы данных, он будет помещать

(newsequentialid())

в свойства таблицы под заголовком. По умолчанию Значение или Связывание, позволяющее заполнять идентификатор, когда он вставлен.

Проблема заключается в том, что вы создаете таблицу и добавляете часть

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

позже, будущие базы данных обновлений не будет добавлять обратно (newsequentialid ())

. Чтобы исправить правильный путь, нужно стереть миграцию, удалить базу данных и перенаправить ... или вы можете просто добавить (newsequentialid ()) в таблицу дизайнер.

0
ответ дан Jeff Li 24 August 2018 в 22:00
поделиться

Это довольно легко. Если вы используете идентификаторы сгенерированных БД (например, 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
}

Структура объекта по умолчанию следует за каждым INSERT с SELECT SCOPE_IDENTITY(), когда используются автоматически сгенерированные Id s.

773
ответ дан maxshuty 24 August 2018 в 22:00
поделиться
1
ответ дан Mr Kunal 24 August 2018 в 22:00
поделиться

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

db.Entry(MyNewObject).GetDatabaseValues();

Затем

int id = myNewObject.Id;

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

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

Вы также можете посмотреть в следующем вопросе @christian ответ в следующем вопросе:

Entity Контекст обновления контекста?

19
ответ дан QMaster 24 August 2018 в 22:00
поделиться
Repository.addorupdate(entity, entity.id);
Repository.savechanges();
Var id = entity.id;

Это будет работать.

6
ответ дан Saket Choubey 24 August 2018 в 22:00
поделиться

Объект, который вы сохраняете, должен иметь правильный Id после распространения изменений в базе данных.

8
ответ дан Snowbear 24 August 2018 в 22:00
поделиться

Вы можете получить идентификатор только после сохранения, вместо этого вы можете создать новый Guid и назначить перед сохранением.

3
ответ дан Vaduganathan Pillappan 24 August 2018 в 22:00
поделиться

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

  1. Использовать сгенерированные с помощью базы данных ID (int или GUID) Минусы: вы должны выполнить SaveChanges(), чтобы получить ID для просто сохраненных объектов. Плюсы: Можно использовать идентификатор int.
  2. Использовать только сгенерированный клиентом ID - только GUID. Плюсы: минимизация операций SaveChanges. Возможность вставить большой график новых объектов за одну операцию. Минусы: разрешено только для GUID
0
ответ дан Vladislav Furdak 24 August 2018 в 22:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: