Невозможно привести частичный класс на основе объекта LINQ-2-SQL - PullRequest
1 голос
/ 28 марта 2011

Допустим, у меня есть таблица базы данных под названием Animals, которую я перетаскиваю в свой файл DBML Linq-2-SQL.

Это создает мне класс под названием Animal.

Затем я создаю класс для его расширения, например:

public partial class Animal{
 //my extra code here
}

Но я также хочу иметь такой класс:

public class Zebra : Animal{
 //even more extra code here
}

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

Animal a = dataContext.Animals.Where(c=>c.id.Equals(id)).SingleOrDefault();
return (Zebra)a;

Я сократил свои занятия до такой степени, что они стали совершенно пустыми в попытке работать, почему это не работает. Безрезультатно.

Этот процесс приведения работал в проекте, отличном от LINQ-2-SQL, который я переключаю на MVC / LINQ.

Сделано много гуглить, но на этот раз совершенно тупо ...

Предполагая, что это невозможно, какой лучший альтернативный подход? Интерфейсы?

Джейк

1 Ответ

2 голосов
/ 28 марта 2011

Это не работает, потому что, хотя Зебра - это Животное, не все Животные - это Зебры.Когда вы получаете класс, он ничего не знает о дополнительных методах и свойствах, принадлежащих классу Zebra.Если бы вы могли разыграть его как Зебру, он бы пропустил это.

Что вам, вероятно, следует сделать, это создать конструктор на Зебре, который берет Животное и создает объект Зебра из этого Животного (если это возможно).

return dataContext.Animals
                  .Where( c => c.id == id )
                  .Select( a => new Zebra(a) )
                  .SingleOrDefault();

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

...