Подтвердить что ты не робот

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

Является ли Framework Entity Framework столбцами идентификаторов?

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

4b9b3361

Ответ 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, и вы найдете обновленный идентификатор. Может быть, там лучший способ, но концепция там