我有这样的设置:
public class PseudoContext : DbContext
{
public DbSet<Account> Accounts {get; set;}
public PseudoContext()
{
Accounts = new PseudoDbSet<Account>();
}
}
public class PseudoDbSet<T> : DbSet<T> {}
因此,在运行时,Accounts
的类型应为PseudoDbSet<Account>
?
当我尝试通过Accounts
访问DbSet<Account> accountsSet = context.Accounts;
时,我无法通过var tempSet = (PseudoDbSet<Account>)accountsSet
向下转发,我得到以下运行时异常:
测试方法RoleManagerTest.PseudoContextTest.Add_ValidAccount_AccountAdded引发异常:System.InvalidCastException:无法将类型为'System.Data.Entity.DbSet 1 [RoleManager.Models.Account]'的对象强制转换为'RoleManager.Models.PseudoDbSet 1 [ RoleManager.Models.Account]
为什么?
编辑以包含更多信息。
答案 0 :(得分:0)
请看这个示例代码:
using System;
namespace Demo
{
public class DbSet<T> { }
public class Account { }
public class PseudoContext
{
public DbSet<Account> Accounts {get; set;}
public PseudoContext()
{
Accounts = new PseudoDbSet<Account>();
}
}
public class PseudoDbSet<T> : DbSet<T> {}
class Program
{
static void Main(string[] args)
{
PseudoContext ct = new PseudoContext();
PseudoDbSet<Account> db = (PseudoDbSet<Account>)ct.Accounts;
Console.WriteLine(typeof(PseudoDbSet<Account>).FullName);
Console.WriteLine(ct.Accounts.GetType().FullName);
Console.ReadLine();
}
}
}
它工作正常,因为所有类都被正确继承。
在您的代码中,DbSet
继承了PseudoDbSet
类的错误。尝试从这两种类型中提取FullName
,并在向下转发失败的位置将它们与DbSet
类型的全名进行比较。在我的例子中,这两种类型是相同的,一切都很顺利。