2016-01-25 4 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<IActivity> из List<Erp> или List<Scip> используя функцию ковариации: 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 может помочь вам в этом.

Смежные вопросы