Получение идентификатора после вставки из другой таблицы [дубликат]

Попробуйте следующее:

  / ^ stop. * $ /  

Объяснение:

  • / charachters ограничивают регулярное выражение (т. е. они не являются частью Regex per se)
  • ^ означает совпадение в начале строки
  • . (*)
  • $ означает конец строки

Если вы хотите обеспечить соблюдение за которым следует пробел, вы можете изменить RegEx следующим образом:

  / ^ stop \ s +. * $ /  
  • \ s означает любой пробельный символ
  • +, следующий за \ s, означает, что после слова остановки
  • должен быть хотя бы один пробельный символ.

Примечание. Также имейте в виду, что RegEx выше требует, чтобы за стоповым словом пробежало пространство! Поэтому он не будет соответствовать строке, содержащей только: stop

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

10 ответов

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

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 16 August 2018 в 00:26
поделиться

Я использовал ответ 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, из-за использования голосового ответа для чего-то это может не потребоваться.

64
ответ дан Community 16 August 2018 в 00:26
поделиться
  • 1
    Благодаря ! ВАЖНАЯ рекомендательная рекомендация: var order = new Заказ {Customer = customer}; Это показывает способность Entity Framework назначать связанный объект, и идентификатор будет автоматически обновляться. – LA Guy 88 9 July 2017 в 19:06
  • 2
    спасибо, что специально указал на это. Я делал по умолчанию. + 1ed – user2695433 19 September 2017 в 05:33

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

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

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

(newsequentialid())

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

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

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

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

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

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

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

768
ответ дан maxshuty 16 August 2018 в 00:26
поделиться
  • 1
    Поэтому вы задаете неправильный вопрос. Если у вас есть проблема с исключением, вы должны задать вопрос, показывающий ваше исключение (и внутреннее исключение) и фрагмент кода, вызывающий эту ошибку. – Ladislav Mrnka 6 March 2011 в 21:09
  • 2
    Убедитесь, что объект, который вы добавляете, является действительным объектом, например, чем-либо с ограничением базы данных «не null». должны быть заполнены и т.д. – fran 3 June 2011 в 10:35
  • 3
    @LadislavMrnka: Как насчет свойств навигации вновь созданного объекта? Кажется, что после сохранения изменений они автоматически не заполняются. – Isaac Kleinman 11 November 2014 в 19:21
  • 4
    Рассмотрим следующий сценарий: table1 должен генерировать идентификатор @@, чтобы использовать его в таблице2. Предполагается, что как таблица1, так и таблица2 должны находиться в одной транзакции, например. одна операция SaveChange должна сохранять данные таблицы. Идентификация @@ не будет сгенерирована, если не будет вызван «SaveChanges». как мы можем решить эту ситуацию? – Arash 24 November 2014 в 00:09
  • 5
    @Djeroen: Если вы используете Идентификатор, сгенерированный с помощью базы данных, вам нужно сначала вставить эти объекты в базу данных. Если вам нужно иметь идентификаторы перед вставкой, вы должны создать свою собственную логику для получения уникальных идентификаторов перед вставкой данных и не использовать столбец идентификаторов в базе данных. – Ladislav Mrnka 3 December 2015 в 15:12

Я сталкиваюсь с ситуацией, когда мне нужно вставить данные в базу данных & amp; одновременно требуют, чтобы первичный идентификатор использовал структуру сущности. Решение:

long id;
IGenericQueryRepository<myentityclass, Entityname> InfoBase = null;
try
 {
    InfoBase = new GenericQueryRepository<myentityclass, Entityname>();
    InfoBase.Add(generalinfo);
    InfoBase.Context.SaveChanges();
    id = entityclassobj.ID;
    return id;
 }
1
ответ дан Mr Kunal 16 August 2018 в 00:26
поделиться

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

db.Entry(MyNewObject).GetDatabaseValues();

Затем

int id = myNewObject.Id;

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

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

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

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

18
ответ дан QMaster 16 August 2018 в 00:26
поделиться
  • 1
    Привет, когда мне это нравится, я получаю ошибку компиляции, которая говорит: не удается разрешить свойства, например Id или Name, можете ли вы мне помочь? – Morteza Azizi 17 October 2014 в 06:41
  • 2
    @MortezaAzizi Кажется, что ошибка не обработанной или нулевой проблемы свойства, но можете ли вы, пожалуйста, объяснить или написать некоторый фрагмент кода? – QMaster 18 October 2014 в 09:54
Repository.addorupdate(entity, entity.id);
Repository.savechanges();
Var id = entity.id;

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

6
ответ дан Saket Choubey 16 August 2018 в 00:26
поделиться
  • 1
    Репозиторий не несет ответственности за сохранение изменений в базе данных. Это работа UnitOfWork. – tchelidze 11 November 2017 в 11:55

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

8
ответ дан Snowbear 16 August 2018 в 00:26
поделиться
  • 1
    у нас есть ошибка, например, ошибка при обновлении записей. см. внутреннее исключение для подробностей & quot; – ahmet 6 March 2011 в 20:37
  • 2
    вы видели внутреннее исключение? ;-) – Snowbear 6 March 2011 в 21:02

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

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

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

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

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