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;
}

DogCatPigclass是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。这将违反强类型。