无法隐式转换类型 DbSet
Cannot implicitly convert type DbSet
我有一个包含许多 DbSet 的上下文。其中一些 DbSet 实现了一个名为 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; }
}
我的问题是,出现以下编译错误:
关于案例中的 return 个语句:
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>'
谁能告诉我如何解决这个问题?
我认为这是不可能的,您不能将 DbSet<Foo>
转换为 DbSet<IFoo>
。
解决方法可能是先选择正确的 DbSet
并具体化数据(执行查询)。然后,您可以使用协方差功能从 List<Erp>
或 List<Scip>
创建新列表 List<IActivity>
:Cast List<T> to List<Interface>
您应该能够使用通用约束:
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 的上下文。其中一些 DbSet 实现了一个名为 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; }
}
我的问题是,出现以下编译错误: 关于案例中的 return 个语句:
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>'
谁能告诉我如何解决这个问题?
我认为这是不可能的,您不能将 DbSet<Foo>
转换为 DbSet<IFoo>
。
解决方法可能是先选择正确的 DbSet
并具体化数据(执行查询)。然后,您可以使用协方差功能从 List<Erp>
或 List<Scip>
创建新列表 List<IActivity>
:Cast List<T> to List<Interface>
您应该能够使用通用约束:
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
的属性,也许我的回答