У меня есть приложение, в котором я внедряю шаблон синглтона в базу данных, и у меня возникают огромные проблемы.
У меня есть следующая таблица, 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 })
}
Проблема заключается в том, что я не могу добавить ссылку на что-то, что еще не находится в контексте данных, на что-то, что находится в контексте данных. Это правильно? Как мне обойти это ограничение?
Спасибо,
Рой