首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架: ObjectSet及其(泛型)变化

实体框架: ObjectSet及其(泛型)变化
EN

Stack Overflow用户
提问于 2010-09-15 02:55:52
回答 2查看 5.7K关注 0票数 4

我使用: EntityFramework + POCO

事情是这样的:

代码语言:javascript
复制
public interface IBaseType
{
    int Id { get; set; }
}

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

public class DerivedType : BaseType
{
}

问题是:

代码语言:javascript
复制
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);
    }
}

如果TBaseType,这一切都可以很好地工作,但是:问题是在EntityFramework中,当一个类继承另一个类时,它们共享ObjectSet,因此,如果TDerivedType,则GetTheObjectSet返回ObjectSet<BaseType>,它不能转换为ObjectSet<DerivedType>

有没有办法来转换这个东西,或者以某种方式执行SingleOrDefault?可以使用IObjectSet<>IBaseType转换这些内容吗

EN

回答 2

Stack Overflow用户

发布于 2010-09-15 04:35:07

我想你在找这个:

代码语言:javascript
复制
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从中派生)将返回派生类型的对象。

票数 7
EN

Stack Overflow用户

发布于 2010-09-15 04:30:23

我检查了我的一个测试项目,该项目目前远离可构建状态,但这对我来说很有效:

代码语言:javascript
复制
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时没有任何问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3712011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档