ADO.NET Entity Framework и столбцы идентификаторов

Знает ли Entity Framework о столбцах идентификаторов?

Я использую SQL Server 2005 Express Edition и имею несколько таблиц, в которых первичным ключом является столбец идентификаторов. когда я использую эти таблицы для создания модели сущности и использую модель в сочетании с привязкой источника данных сущности к представлению формы для создания новой сущности, меня просят ввести значение для столбца идентификаторов. Есть ли способ заставить фреймворк не запрашивать значения для столбцов идентификаторов?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
50
0
44 070
10

Ответы 10

Entity Framework знает и может обрабатывать столбцы идентификаторов.

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

Вы должны установить спецификацию идентификаторов столбцов идентификаторов так, чтобы для свойства (Is Identity) было установлено значение true. Вы можете сделать это в своем конструкторе таблиц в SSMS. Затем вам может потребоваться обновить модель данных сущности.

Возможно, именно это вы имели в виду, говоря «Первичный ключ - это столбец идентификации», или, возможно, вы пропустили этот шаг.

Если все остальное не помогло, прежде чем вы вырвете волосы, попробуйте удалить свою EntityModel и повторно импортировать из SQL Server. Если вы настраивали ключи и отношения и полагались на функцию «обновить модель из базы данных», она все еще немного глючит в версии RC, которую я нашел - свежий импорт может помочь.

Это все еще актуально 7 лет спустя. Обновление не улавливает мои ключевые изменения. Создание свежей модели решило проблему.

nunzabar 28.08.2015 21:13

Я знаю, что этот пост довольно старый, но он может помочь следующему прибывшему человеку услышать через поиск Google по запросам «Entitiy Framework» и «Identity».

Кажется, что Entity Frameworks уважает первичные ключи, сгенерированные сервером, как и в случае, если установлено свойство «Identity». Однако для модели на стороне приложения по-прежнему требуется, чтобы в методе CreateYourEntityHere был предоставлен первичный ключ. Указанный здесь ключ отбрасывается при вызове SaveChanges() контекста.

На странице здесь представлена ​​подробная информация об этом.

Entity framework по какой-то причине не полностью понимает Identities. Правильный обходной путь - установить для этого столбца Setter значение Private. Это заставит любой сгенерированный пользовательский интерфейс понять, что он не должен устанавливать значение идентификатора, поскольку для него невозможно установить частное поле.

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

Chinjoo 08.07.2010 08:05

Что сработало для меня, так это установка StoreGeneratedPattern на None, когда это был столбец Identity. Теперь все работает стабильно. Основная проблема заключается в том, что редактирование моделей является крайне сложной задачей, если у вас много моделей.

Это лучший ответ, который я когда-либо видел. Вам необходимо вручную отредактировать xml уровня хранения, чтобы установить StoreGeneratedPattern = "Identity" для каждого первичного ключа типа UniqueIdentifier, для которого установлено значение по умолчанию NewID().

http://web.archive.org/web/20130728225149/http://leedumond.com/blog/using-a-guid-as-an-entitykey-in-entity-framework-4/

Прочитав этот совет, я обнаружил, что отсутствующий идентификатор был добавлен, но EF нужно было удалить и обновить объект в модели данных сущности, чтобы все исправить.

goosemanjack 30.05.2012 08:13

Я не могу в это поверить. Intellisensing ItemCollection дает один элемент с ID = 0 после SaveChanges.

            Dim ItemCollection = From d In action.Parameter
            Select New STOCK_TYPE With {
                        .Code = d.ParamValue.<Code>.Value,
                        .GeneralUseID = d.ParamValue.<GeneralUse>.Value,
            }


            GtexCtx.STOCK_TYPE.AddObject( ItemCollection.FirstOrDefault)
            GtexCtx.SaveChanges()

Неважно что я делаю. Спустя 8 часов, включая удаление моей модели, 35 раз построение и восстановление, экспериментирование и редактирование XML EDMX, и теперь я почти полностью удалил мою базу данных SQL Server. На 36-й компиляции это ошеломляющее решение сработало

            Dim abc = ItemCollection.FirstOrDefault
            GtexCtx.STOCK_TYPE.AddObject(abc)
            GtexCtx.SaveChanges()

abc.ID yield 41 (идентификатор, который мне нужен)

Обновлено: Вот простой код для размышления о цикле AddObject и при этом получить идентификатор

Dim listOfST As List(Of STOCK_TYPE) = ItemCollection.ToList()
      For Each q As STOCK_TYPE In listOfST 
         GtexCtx.STOCK_TYPE.AddObject(q)
      Next
 GtexCtx.SaveChanges()

...more code for inter-relationship tables

Попробуйте Intellisence listOfST после SaveChanges, и вы найдете обновленный идентификатор. Может быть, есть способ получше, но концепция есть

В C# вы можете сделать что-то вроде этого, чтобы он знал:

В вашем FooConfiguration.cs : EntityTypeConfiguration<Foo>:

this.Property(x => x.foo).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

Затем, чтобы использовать его, просто обязательно вставьте элемент в контекст и вызовите context.SaveChanges() перед использованием x.foo, чтобы получить обновленное автоматически увеличивающееся значение. В противном случае x.foo будет просто 0 или нулевым.

Если вы используете Entity Framework 5, вы можете использовать следующий атрибут.

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

Другие вопросы по теме