ADO.NET Entity Framework и столбцы идентификации
Является ли Framework Entity Framework столбцами идентификаторов?
Я использую SQL Server 2005 Express Edition и имею несколько таблиц, где первичный ключ является столбцом идентификации. когда я использую эти таблицы для создания модели сущности и использую модель совместно с сущностью datasource-связью с формой, чтобы создать новый объект, мне предлагается ввести значение для столбца идентификации. Есть ли способ заставить структуру не запрашивать значения для столбцов идентификации?
Ответы
Ответ 1
Я знаю, что этот пост довольно старый, но это может помочь следующему человеку, который приходит через поиск Google для "Entitiy Framework" и "Identity".
Кажется, что Entity Frameworks уважает первичные ключи, созданные сервером, так как это было бы, если установлено свойство "Идентификация". Однако модель прикладной стороны по-прежнему требует, чтобы первичный ключ поставлялся в методе CreateYourEntityHere
. Указанный здесь ключ отбрасывается при вызове SaveChanges()
контекста.
Страница здесь содержит подробную информацию об этом.
Ответ 2
Если вы используете Entity Framework 5, вы можете использовать следующий атрибут.
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
Ответ 3
Вы должны установить спецификацию идентификации столбцов идентификаторов, чтобы для свойства (Is Identity) было установлено значение true. Вы можете сделать это в своем дизайнере таблиц в SSMS. Затем вам может потребоваться обновить модель данных сущности.
Возможно, это то, что вы подразумеваете под словом "Первичный ключ - столбец идентификации", или, возможно, вы пропустили этот шаг.
Ответ 4
Это лучший ответ, который я видел. Вы должны вручную отредактировать слой 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/
Ответ 5
Entity Framework знает и может обрабатывать столбцы идентификаторов.
Ваша проблема может быть, может быть, не самой EF, а сгенерированной формой. Попробуйте удалить вход для столбца идентификации из формы вставки и посмотреть, что произойдет.
Ответ 6
Если все остальное не удастся, прежде чем вы вырвать волосы - попробуйте удалить EntityModel и повторно импортировать из SQL Server. Если вы настраивали ключи и отношения и полагались на функцию "модель обновления из базы данных", она все еще немного ошибочна в найденной мной версии RC - может помочь свежий импорт.
Ответ 7
В С# вы можете сделать что-то вроде этого, чтобы узнать:
В FooConfiguration.cs : EntityTypeConfiguration<Foo>
:
this.Property(x => x.foo).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Затем, чтобы использовать его, просто обязательно вставьте элемент в контекст и вызовите context.SaveChanges()
, прежде чем использовать x.foo
, чтобы получить обновленное значение с автоматическим добавлением. В противном случае x.foo
будет просто 0 или null.
Ответ 8
Структура сущностей по какой-то причине не полностью понимает Identities. Правильное обходное решение - установить Setter для этого столбца в Private. Это заставит любой сгенерированный пользовательский интерфейс понять, что он не должен устанавливать значение идентификатора, поскольку для него невозможно установить частное поле.
Ответ 9
Что сработало для меня, это установить StoreGeneratedPattern в None, когда это столбец Identity. Теперь все работает последовательно. Основная проблема заключается в том, что редактирование моделей является крайне сложной задачей, если у вас много моделей.
Ответ 10
Я не могу в это поверить. Intellisensing ItemCollection дает единый элемент с идентификатором = 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, и вы найдете обновленный идентификатор. Может быть, там лучший способ, но концепция там