Я могу ответить только на вторую часть вашего вопроса: «Кроме того ... почему в моем DataContext (т.е. container.Funds) нет ObjectSet для« Funds »?»
Этонормально, что ObjectContext имеет только ObjectSet базового класса в вашей иерархии классов.В действительности нет необходимости в ObjectSet производных классов.Для добавления и удаления производных объектов в / из ObjectContext вы можете просто использовать AddObject
и DeleteObject
методы ObjectSet<BaseEntity>
/ BaseEntities
, как вы уже сделали в своем примере.
Для запроса производныхобъекты, которые вы можете использовать метод OfType
ObjectSet.Он возвращает ObjectQuery производного типа, где вы можете строить дальнейшие запросы по:
ObjectQuery<Fund> query = container.BaseEntities.OfType<Fund>();
(Первая часть вашего вопроса звучит как ошибка отображения между хранилищем и концептуальной моделью. Возможно, она лучшеcif вы могли бы показать соответствующие части вашего файла EDMX.)
Редактировать: Возможное решение первой части вопроса:
Я создал ваш пример сПервая модель в VS2010, и я мог воспроизвести ваш вопрос.Кажется, проблема связана с тем, что первичный ключ в вашей модели - это не Int32
, а Guid
.Когда вы добавляете новую сущность в модель, дизайнер всегда предлагает Int32
в качестве первичного ключа с StoreGeneratedPattern
, установленным на Identity
.
Если вы измените тип ключа в конструкторе модели сInt32
до Guid
, но оставив StoreGeneratedPattern
без изменений, равным Identity
, DDL создает базу данных в SQL Server с Id
, установленным на тип uniqueidentifier
, но спецификацией идентификации для этого столбца является "Нет".
Итак, когда EF отправляет команду INSERT в БД, он «думает» из определения модели, что первичный будет автоматически сгенерирован в БД, и не отправляет Guid в БД, которую вы назначили в коде.Но БД не создает ключ, что приводит к значению NULL для ключа.Отсюда получаем ошибку.
Решение: Установите в конструкторе модели для свойства Id
для BaseEntity
для StoreGeneratedPattern
в None
.Для меня это сработало тогда.Конечно, вы обязаны всегда назначать Guid на Id
, прежде чем добавлять новый объект в ObjectSet, но, похоже, это то, что вам нужно.