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