2012-06-27 14 views
7

Powiedzmy mam następujące podmiotyPowrót typu jednostki przy użyciu stołu od rodzaju dziedziczenia

public abstract class Animal 
{ 
    public int Id {get;set;} 
} 

public class Cat : Animal 
{ 
} 

public class Dog : Animal 
{ 
} 

Czy to możliwe, aby określić typ jednostki bez tworzenia instancji.

var id = 1; 
var type = context.Animals.GetTypeOfAnimal(id) 

public static Type GetTypeOfAnimal(this ObjectSet<Animal> source, int id) 
{ 
    // What shall I do here, I dont want to fetch the instance at this point... 
    var animal = source.First(a => a.Id == id); 
    return animal.GetType(); 
} 

Jednym z rozwiązań Myślałem o użyciu następującej metody ...

public static Type GetTypeOfAnimal(this ObjectSet<Animal> source, int id) 
{ 
    var info = source.Where(a => a.Id == id).Select(a => new {IsDog = a is Dog, IsCat = a is Cat}).First(); 

    if(info.IsDog) return typeof(Dog); 
    if(info.IdCat) return typeof(Cat); 

    return null; 
} 
+1

Nie sądzę, że możesz. – Yeonho

+0

Projekt również trochę pachnie; sprawdzanie określonego podtypu typu generycznego, a następnie odgałęzienie, które prawdopodobnie powinno zostać zastąpione polimorfizmem. – millimoose

+0

W miejscu komentarza źródło zostało już pobrane. Czy to właśnie próbujesz zapobiec? EDYCJA: Nie, teraz widzę. Myślisz teraz. – Michael

Odpowiedz

2

Nie ma sposobu, aby uzyskać te informacje bez zapytania do bazy danych. Używasz TPT - oznacza to, że baza danych zawiera tabele zwierząt, psów i kotów. Dziedziczenie w bazie danych jest modelowane poprzez relację jeden do jednego pomiędzy zwierzęciem i psem oraz między zwierzęciem a kotem. Najmniejszą rzeczą, jaką musisz zrobić, jest zapytanie o tablice zwierząt i psów dla tego identyfikatora (może istnieć tylko w jednym z nich). Pierwszym problemem jest to, że nie można wysyłać zapytań do tych tabel bezpośrednio z EF, ponieważ EF może działać tylko z całymi jednostkami (nie tylko z częściami zmapowanymi do pojedynczej tabeli) - musisz użyć bezpośredniego SQL. Drugim problemem jest kruchość tego rozwiązania. Jeśli dodasz nową jednostkę pochodną, ​​musisz naprawić to zapytanie (tak samo dzieje się w twoim przykładzie).

Powodem zapytań TPT są powolne, że EF musi kwerendy wszystkie drzewa dziedziczenia = w przypadku Animal połączone z Dog połączonego z Animal połączone z Cat. W usłudze .NET 4.5 wprowadzono pewne ulepszenia do sprawdzania drzewa dziedziczenia TPT, ale nie wpłynie to na zapytanie, ponieważ musi po prostu zapytać o całą strukturę.

+0

Po prostu z ciekawości: czy można uniknąć tej kary za pomocą projekcji, która korzysta tylko z właściwości zdefiniowanych w "Zwierzęciu"? – millimoose

Powiązane problemy