Entity Framework SaveChanges - как игнорировать поля ID/Identity при INSERT

Приложение VB .NET 4 WinForms.

У меня есть сетка (DevExpress), привязанная к IEnumerable (из MyClass). Всякий раз, когда добавляется новая строка, идентификатор по умолчанию равен нулю (0). При попытке сохранить изменения EntityFramework не понимает, что поле идентификации означает, что оно должно игнорировать любое содержимое при вставке и просто вставлять другие значения. Я не могу указать null/Nothing, потому что он просто сохраняет идентификатор равным нулю.

Я могу добавлять и сохранять экземпляры MyClass вручную, но я пытаюсь заставить его работать там, где сетка обрабатывает добавление/инициализацию/и т. д. новых записей. Насколько я могу судить, проблема не в сетке, а в Entity Framework и сгенерированном SQL и классах сущностей.

{"Cannot insert explicit value for identity column in table 'MyClasses' when IDENTITY_INSERT is set to OFF."}

Будем очень признательны за любую помощь, чтобы я не выбросил свой ноутбук из окна!


person nathanchere    schedule 20.06.2010    source источник
comment
Кажется, что ваша таблица БД не имеет личности.   -  person Restuta    schedule 20.06.2010


Ответы (1)


Если свойство Entity имеет значение Identity (автоинкрементное значение) в базе данных, оно указано в StorageModel вашей модели Entity. Возможно, этот параметр не подходит для вашего конкретного поля. Вы можете проверить это, открыв файл edmx вашей модели и заглянув в раздел StorageModels. Это должно выглядеть так:

<edmx:StorageModels>
  ...
  <EntityType Name="MyClass">
    <Key>
      <PropertyRef Name="ID" />
    </Key>
    <Property Name="ID" Type="..." Nullable="..." StoreGeneratedPattern="Identity" />
    ...
  </EntityType>
  ...
</edmx:StorageModels>

StoreGeneratedPattern должен быть установлен на Identity. Если есть None или атрибут отсутствует (который по умолчанию равен None), вы действительно получите описанную вами ошибку, поскольку EntityFramework в этом случае не знает, что ID является идентификатором, и выдаст значение для столбца в сгенерированном SQL-INSERT утверждение.

(Убедитесь, что вы действительно проверяете раздел edmx:StorageModels в файле edmx. Раздел edmx:ConceptualModels также имеет атрибут annotation:StoreGeneratedPattern в свойстве, но его настройка не имеет значения для вашей конкретной проблемы. (Я думаю, что это важно только при создании базы данных от модели, но я не уверен.))

person Slauma    schedule 20.06.2010
comment
Как ни странно, другие объекты имеют SGP, указанный в EDMX, и в дизайнере все они имеют одинаковые настройки (ключ объекта, идентификатор и т. д.), но только у рассматриваемого класса отсутствует StoreGeneratedPattern=Identity в разделе EntityType. Объем редактирования XML, который использовался до сих пор, был очень разочаровывающим ... но большое спасибо за ответ, который MSDN и несколько высококлассных блоггеров ORM и .NET не смогли! - person nathanchere; 21.06.2010
comment
Мне было интересно, как этот параметр может отсутствовать, если столбец в базе данных является идентификатором. Возможно, вы изменили столбец позже (после того, как впервые создали свою модель) с неидентифицирующего столбца на идентификационный столбец в таблице БД и забыли обновить свою модель из базы данных? Но, честно говоря, я даже не уверен, действительно ли он обновляется автоматически. Это то, что нужно проверить. - person Slauma; 21.06.2010