实体框架:ObjectSet及其(泛型)方差

Jef*_*fim 4 .net entity-framework casting covariance objectset

我使用:EntityFramework + POCO

这是事情:

public interface IBaseType
{
    int Id { get; set; }
}

public class BaseType : IBaseType
{
    public virtual int Id { get; set; }
}

public class DerivedType : BaseType
{
}
Run Code Online (Sandbox Code Playgroud)

问题:

public class EntityFetcher<T> where T : BaseType
{
    public object GetById(int id)
    {
        ObjectSet<T> objectSet = (ObjectSet<T>)GetTheObjectSet(typeof(T)); 

        return objectSet.SingleOrDefault((o) => o.Id == id);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果TBaseType这一切完美的作品,但是:问题是,在当的EntityFramework一个类继承了另一个他们分享的ObjectSet,因此,如果TDerivedTypeGetTheObjectSet返回ObjectSet<BaseType>,不能被强制转换为ObjectSet<DerivedType>.

有没有办法实际抛出这个东西或以其他方式执行SingleOrDefault?那些东西可以使用IObjectSet<>IBaseType

Ben*_*thy 7

我想你正在寻找这个:

public T GetById(int id)
{
    ObjectSet<T> objectSet = (ObjectSet<T>)GetTheObjectSet(typeof(T)); 

    return objectSet.OfType<T>().SingleOrDefault((o) => o.Id == id);
}
Run Code Online (Sandbox Code Playgroud)

ObjectQueryOfType方法(ObjectSet派生自的方法)将返回派生类型的对象.