我使用: EntityFramework + POCO
事情是这样的:
public interface IBaseType
{
int Id { get; set; }
}
public class BaseType : IBaseType
{
public virtual int Id { get; set; }
}
public class DerivedType : BaseType
{
}问题是:
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);
}
}如果T为BaseType,这一切都可以很好地工作,但是:问题是在EntityFramework中,当一个类继承另一个类时,它们共享ObjectSet,因此,如果T为DerivedType,则GetTheObjectSet返回ObjectSet<BaseType>,它不能转换为ObjectSet<DerivedType>。
有没有办法来转换这个东西,或者以某种方式执行SingleOrDefault?可以使用IObjectSet<>和IBaseType转换这些内容吗
发布于 2010-09-15 04:35:07
我想你在找这个:
public T GetById(int id)
{
ObjectSet<T> objectSet = (ObjectSet<T>)GetTheObjectSet(typeof(T));
return objectSet.OfType<T>().SingleOrDefault((o) => o.Id == id);
}OfType method of an ObjectQuery ( ObjectSet从中派生)将返回派生类型的对象。
发布于 2010-09-15 04:30:23
我检查了我的一个测试项目,该项目目前远离可构建状态,但这对我来说很有效:
public interface IEntity
{
int Id { get; }
byte[] Timestamp { get; set; }
}
public abstract class Entity : IEntity
{
public int Id { get; set; }
public byte[] Timestamp { get; set; }
}
public class PocoData : Entity
{
...
}
public class Repository<T> : IRepository<T> where T : class, IEntity
{
protected ObjectContext Context;
protected ObjectSet<T> ObjectSet;
public Repository(ObjectContext context)
{
Context = context;
ObjectSet = context.CreateObjectSet<T>();
}
public virtual T GetById(int id)
{
return ObjectSet.SingleOrDefault(o => o.Id == id);
}
...
}主要的问题是实体类没有在EDMX文件中建模。在EDMX文件中建模的所有实体都有自己的Id和时间戳,但我的POCO类使用共享基类。我使用Repository时没有任何问题。
https://stackoverflow.com/questions/3712011
复制相似问题