Шаблон базы данных Singleton в Entity Framework - PullRequest
2 голосов
/ 17 июня 2009

У меня есть приложение, в котором я внедряю шаблон синглтона в базу данных, и у меня возникают огромные проблемы.

У меня есть следующая таблица, SingletonTable

+-------------+-------+------------+
| Column Name | Type  | Allow Null |
+-------------+-------+------------+
| Id          | Int   |  No        |
| VarType     | Int   |  No        |
| TypeARef    | Int   |  Yes       |
| TypeBRef    | Int   |  Yes       | 
+-------------+-------+------------+

В EF это делится на два конкретных типа, TypeA и TypeB. TypeARef для TypeA, TypeBRef для TypeB и VarType - дискриминатор. Существует уникальный индекс (VariableType, TypeARef, TypeBRef). Идея одноэлементного шаблона состоит в том, что у нас когда-либо есть только 1 строка в базе данных для данного набора значений, поэтому всякий раз, когда мы добавляем ссылку на SingletonTable, мы сначала проверяем, существует ли эта строка, если она существует, мы возвращаем строка в БД, если это не так, мы создаем строку и возвращаем ссылку на вновь созданную строку. Я абстрагировал это в метод GetSingleton.

Проблема в том, что всякий раз, когда я использую метод GetSingleton, я получаю следующее исключение:

Метод тестирования UnitTests.CreateBasicData.CreateFTIData вызвал исключение: System.InvalidOperationException: объект не может быть добавлен в EntityCollection или EntityReference. Объект, который присоединен к ObjectContext, не может быть добавлен в EntityCollection или EntityReference, который не связан с исходным объектом

Я использую это как таковое

var newRow = new SomeType
{
        singletonValue = GetSingleton(new TypeB{ TypeBRef = Foo })
}

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

Спасибо, Рой

1 Ответ

3 голосов
/ 17 июня 2009

Когда запрос выполняется внутри контекста объекта в Entity Framework, возвращенные объекты автоматически присоединяются к контексту объекта.

Вы также можете прикрепить объекты к контексту объекта, полученные из источника, отличного от запроса. Вы можете прикрепить объекты, которые были ранее отсоединены, объекты, которые были возвращены запросом NoTracking, или объекты, которые были получены вне контекста объекта. Вы также можете прикрепить объекты, которые были сохранены в состоянии просмотра приложения ASP.NET или были возвращены из удаленного вызова метода или веб-службы.

Используйте один из следующих методов для присоединения объекта к контексту объекта:

  • Вызовите AddObject для ObjectContext, чтобы добавить объект к объекту контекст. Делайте это, когда объект является новым объектом, который еще не существует в источнике данных.

  • Вызовите Attach на ObjectContext, чтобы прикрепить объект к объекту. контекст. Сделайте это, когда объект уже существует в источнике данных но в настоящее время не привязан к контексту. Для дополнительной информации, см. Как: прикрепить связанные объекты (Entity Framework).

  • Вызовите AttachTo для ObjectContext, чтобы прикрепить объект к определенному сущность, установленная в контексте объекта. Также сделайте это, если объект имеет null (Ничего в Visual Basic) Значение EntityKey.

http://msdn.microsoft.com/en-us/library/bb896271.aspx

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