ADO.NET Entity Framework и столбцы идентификаторов - PullRequest
50 голосов
/ 23 сентября 2008

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

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

Ответы [ 10 ]

67 голосов
/ 23 декабря 2008

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

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

Страница здесь содержит подробную информацию по этому вопросу.

5 голосов
/ 19 июля 2013

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

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
4 голосов
/ 23 сентября 2008

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

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

3 голосов
/ 08 июня 2011

Это лучший ответ, который я видел. Вы должны вручную отредактировать слой хранения 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/

2 голосов
/ 19 марта 2013

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

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

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

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

2 голосов
/ 25 сентября 2008

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

2 голосов
/ 23 сентября 2008

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

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

1 голос
/ 06 января 2009

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

0 голосов
/ 31 марта 2012

Я не могу в это поверить. 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 выдает 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

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

0 голосов
/ 23 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...