Entity Framework 通用继承
Entity Framework Generic Inheritance
我正在尝试分配从更通用的 class 继承的 class 的 DbSet
。下面的示例演示了我正在努力实现的目标:
DbSet<Animal> dbSet;
switch (selectedAnimal)
{
case "Dog":
dbSet = _Context.Dog; // DbSet<Dog>
break;
case "Cat":
dbSet = _Context.Cat; // DbSet<Cat>
break;
case "Pig":
dbSet = _Context.Pig; // DbSet<Pig>
break;
}
Dog
、Cat
、Pig
class是Animal
的继承class,如下:
public class Dog : Animal { }
但是我得到一个编译时错误
Cannot implicitly convert type DbSet<Dog> to DbSet<Animal>
如何在不出现错误的情况下实现我的设计?
P.S。上面的代码只是为了说明我正在努力实现的目标,所以如果没有意义,请原谅我。
因为编译器无法将派生 classes 转换为基础 class w/o 信息丢失。
您根本无法将 DbSet of Cat 放入 DbSet of Animal where Cat : Animal
但是你可以将 Animal 的 DbSet 放入 Cat 的 DbSet
试试这个:
var dbSet = GetDbSet(selectedObject) //selectedObject is Cat,Dog,Pig whatever
以及方法:
private DbSet<T> GetDbSet<T>(T selectedAnimal) where T : Animal
{
return this.Set<T>(); //this == EF Context
}
你指的是协方差。在 C# 中,只有接口可以是协变的。所以 IEnumerable<Cat>
是 IEnumerable<Animal>
的子类型。声明 DbSet<Animal>
然后将类型 DbSet<Cat>
的变量放入其中的问题在于类型 DbSet<Animal>
的变量具有允许添加 Animal
的方法实体。 Animal
可能是 Dog
。但是您放入其中的变量是 DbSet<Cat>
并且不能包含 Dog
。这将违反强类型。
我正在尝试分配从更通用的 class 继承的 class 的 DbSet
。下面的示例演示了我正在努力实现的目标:
DbSet<Animal> dbSet;
switch (selectedAnimal)
{
case "Dog":
dbSet = _Context.Dog; // DbSet<Dog>
break;
case "Cat":
dbSet = _Context.Cat; // DbSet<Cat>
break;
case "Pig":
dbSet = _Context.Pig; // DbSet<Pig>
break;
}
Dog
、Cat
、Pig
class是Animal
的继承class,如下:
public class Dog : Animal { }
但是我得到一个编译时错误
Cannot implicitly convert type DbSet<Dog> to DbSet<Animal>
如何在不出现错误的情况下实现我的设计?
P.S。上面的代码只是为了说明我正在努力实现的目标,所以如果没有意义,请原谅我。
因为编译器无法将派生 classes 转换为基础 class w/o 信息丢失。 您根本无法将 DbSet of Cat 放入 DbSet of Animal where Cat : Animal
但是你可以将 Animal 的 DbSet 放入 Cat 的 DbSet
试试这个:
var dbSet = GetDbSet(selectedObject) //selectedObject is Cat,Dog,Pig whatever
以及方法:
private DbSet<T> GetDbSet<T>(T selectedAnimal) where T : Animal
{
return this.Set<T>(); //this == EF Context
}
你指的是协方差。在 C# 中,只有接口可以是协变的。所以 IEnumerable<Cat>
是 IEnumerable<Animal>
的子类型。声明 DbSet<Animal>
然后将类型 DbSet<Cat>
的变量放入其中的问题在于类型 DbSet<Animal>
的变量具有允许添加 Animal
的方法实体。 Animal
可能是 Dog
。但是您放入其中的变量是 DbSet<Cat>
并且不能包含 Dog
。这将违反强类型。