无法隐式转换类型DbSet

时间:2016-01-25 17:06:39

标签: c# entity-framework interface dbcontext

我有一个包含许多DbSet的上下文。其中一些DbSets实现了一个名为IActivity的接口,它包含许多常见字段,如TimeReceived,TimeSent。

在我的控制器中,我需要读取其中一个上下文DbSets的值,但我不知道哪个值直到运行时。所以我创建了以下FactoryClass:

public static class ActivityFactory
{
    public static DbSet<IActivity> GetDbSet(BAMContext context, BizTalkApplicationEnum previousApplication)
    {
        switch (previousApplication)
        {
            case BizTalkApplicationEnum.Erp:
                return context.ErpRecs;
            case BizTalkApplicationEnum.Scip:
                return context.ScipRecs;
        }
        return null;
    }
}

IActivity接口定义如下:

public interface IActivity
{
    string ActivityID { get; set; }
    string InterchangeId { get; set; }
    DateTime LastModified { get; set; }
    DateTime? TimeReceived { get; set; }
    DateTime? TimeSent { get; set; }
    string RoutingSource { get; set; }
    string RoutingTarget { get; set; }
    string RoutingToClient { get; set; }
    string RoutingMaster { get; set; }
    string ReceivePort { get; set; }
    string SendPort { get; set; }
    string RoutingMessageType { get; set; }
}

......和BAM背景:

public class BAMContext : DbContext
{
    public BAMContext()
        : base("BAMPrimaryImportConString")
    {
        this.Configuration.LazyLoadingEnabled = false;
        Database.SetInitializer<BAMContext>(null);
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }

    public virtual DbSet<Erp> ErpRecs { get; set; }
    public virtual DbSet<Scip> ScipRecs { get; set; }
}

我的问题是,我收到以下编译错误: 关于案件内的退货声明:

Error   CS0029  Cannot implicitly convert type 'System.Data.Entity.DbSet<TVS.ESB.BamPortal.DomainClasses.BAM.Erp>' to 'System.Data.Entity.DbSet<TVS.ESB.BamPortal.DomainClasses.BAM.IActivity>'

有谁能告诉我如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您应该能够使用通用约束:

public static class ActivityFactory
{
public static DbSet<T> GetDbSet<T>(BAMContext context, 
             BizTalkApplicationEnum previousApplication) where T: class, IActivity
{
    switch (previousApplication)
    {
        case BizTalkApplicationEnum.Erp:
            return context.ErpRecs;
        case BizTalkApplicationEnum.Scip:
            return context.ScipRecs;
    }
    return null;
}
}

你的下一个问题是访问你回来的dbset上IActivity的属性,也许我的回答here可以帮助你。

答案 1 :(得分:1)

我认为这是不可能的,您无法将DbSet<Foo>转换为DbSet<IFoo>

解决方法可能是首先选择正确DbSet并实现数据(执行查询)。然后,您可以使用协方差功能从List<IActivity>List<Erp>创建新列表List<Scip>Cast List<T> to List<Interface>