2013-07-25 2 views
2

я получаю исключение: InvalidOperationException: The original state instance has the wrong type. при использовании версии следующего сократить код:Исходное состояние экземпляра имеет неправильный тип

Table existing = context.Tables.Single(t => t.Key == derivedFromTable.Key); 

context.Tables.Attach((Table)derivedFromTable, existing); //thrown here 

context.SubmitChanges(); 

Где derivedFromTable is DerivedFromTable и class DerivedFromTable : Table.

Что означает это исключение (как ясно ((Table)derivedFromTable) is Table и existing is Table) и как его разрешить?

ответ

1

(Table)derivedFromTable литье бессмысленно, потому что метод Attach() уже принимает аргумент типа Table, поэтому расширяющийся листинг неявный.

Это не имеет значения, поскольку Linq to SQL проверяет тип передаваемого объекта динамически и в основном он не поддерживает обработку производных типов, как если бы они были базовым объектом (также потому, что кастинг не изменяется фактический тип экземпляра, он просто изменяет свой статический интерфейс). Поэтому, если вы хотите это сделать, вам нужно сначала скопировать свойства производного экземпляра в экземпляр базового типа, используя что-то вроде AutoMapper. Пример:

Table existing = context.Tables.Single(t => t.Key == derivedFromTable.Key); 
Table table = Mapper.Map<DerivedFromTable, Table>(derivedFromTable); 
context.Tables.Attach(table , existing); 
context.SubmitChanges(); 
+0

Спасибо! К счастью, мой класс «Таблица» содержит конструктор, который принимает тип «Таблица», поэтому теперь у меня есть «var updated = new Table (производныйFromTable)», а затем «Attach (обновленный, существующий)». –

+0

... который не работает ... Думаю, мне придется идти по вашему маршруту. –

+0

Спасибо за согласие ... не знаю, почему ваше решение не будет работать, если конструктор копирования не работает должным образом или что-то в этом роде. Если вы используете AutoMapper, обязательно выполняйте «Mapper.CreateMap ()» в какой-то момент во время запуска приложения, иначе ваша карта не будет инициализирована, и вы получите сообщение об ошибке при попытке вызвать «Mapper.Map < DerivedFromTable, Table>() ' – luksan

Смежные вопросы