2016-01-25 57 views
0

我有一个包含许多DbSets的上下文。其中一些DbSets实现了一个名为IActivity的接口,其中包含许多常用字段,如TimeReceived,TimeSent。不能隐式转换类型DbSet

在我的控制器中,我需要从上下文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>' 

任何人都可以请让我知道我可以如何解决这个问题?

+0

您究竟在哪里得到错误? – Domysee

+0

编译错误:“return context.ErpRecs;”和这一行:“return context.ScipRecs;” –

+0

好的。你写了“*这些DbSets中的一些实现了一个名为IActivity *的接口”,DbSets是否实现了该接口或它封装的模型? – Domysee

回答

1

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

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

2

你应该能够与通用约束工作:

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

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