2016-01-25 64 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可以幫助你。