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





Entity Framework знает и может обрабатывать столбцы идентификаторов.
Возможно, ваша проблема заключается не в самом EF, а в его сгенерированном виде. Попробуйте удалить ввод для столбца идентификаторов из формы вставки и посмотрим, что произойдет.
Вы должны установить спецификацию идентификаторов столбцов идентификаторов так, чтобы для свойства (Is Identity) было установлено значение true. Вы можете сделать это в своем конструкторе таблиц в SSMS. Затем вам может потребоваться обновить модель данных сущности.
Возможно, именно это вы имели в виду, говоря «Первичный ключ - это столбец идентификации», или, возможно, вы пропустили этот шаг.
Если все остальное не помогло, прежде чем вы вырвете волосы, попробуйте удалить свою EntityModel и повторно импортировать из SQL Server. Если вы настраивали ключи и отношения и полагались на функцию «обновить модель из базы данных», она все еще немного глючит в версии RC, которую я нашел - свежий импорт может помочь.
Я знаю, что этот пост довольно старый, но он может помочь следующему прибывшему человеку услышать через поиск Google по запросам «Entitiy Framework» и «Identity».
Кажется, что Entity Frameworks уважает первичные ключи, сгенерированные сервером, как и в случае, если установлено свойство «Identity». Однако для модели на стороне приложения по-прежнему требуется, чтобы в методе CreateYourEntityHere был предоставлен первичный ключ. Указанный здесь ключ отбрасывается при вызове SaveChanges() контекста.
На странице здесь представлена подробная информация об этом.
Entity framework по какой-то причине не полностью понимает Identities. Правильный обходной путь - установить для этого столбца Setter значение Private. Это заставит любой сгенерированный пользовательский интерфейс понять, что он не должен устанавливать значение идентификатора, поскольку для него невозможно установить частное поле.
В этом случае вы не сможете редактировать объект с помощью ключа, так как значение для обновленного объекта будет равно 0, и вы не сможете сохранить обновленные изменения, поскольку вы не можете найти объект в коллекции с помощью ключа. (этот случай для MVC)
Что сработало для меня, так это установка StoreGeneratedPattern на None, когда это был столбец Identity. Теперь все работает стабильно. Основная проблема заключается в том, что редактирование моделей является крайне сложной задачей, если у вас много моделей.
Это лучший ответ, который я когда-либо видел. Вам необходимо вручную отредактировать xml уровня хранения, чтобы установить StoreGeneratedPattern = "Identity" для каждого первичного ключа типа UniqueIdentifier, для которого установлено значение по умолчанию NewID().
Прочитав этот совет, я обнаружил, что отсутствующий идентификатор был добавлен, но EF нужно было удалить и обновить объект в модели данных сущности, чтобы все исправить.
Я не могу в это поверить. 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)]
Это все еще актуально 7 лет спустя. Обновление не улавливает мои ключевые изменения. Создание свежей модели решило проблему.