我很难理解为什么我会收到InvalidCastException 以下是我收到的错误消息:
无法将“System.Data.Entity.DynamicProxies.Man_58184D79075BC811252680D7866D3D69D0C46FD038D3B123A5E3B102E1FC77A2”类型的对象强制转换为“System.Data.Entity.DbSet`1 [ConsoleApplication1.Man]”。
此存储库类的目的是保存给定的DbContext和DbSet,并调用其方法来删除记录和/或显示给定DbSet的所有记录。
public class Repository<TEntity> where TEntity : class
{
private DbContext dbContext;
private DbSet<TEntity> dbSet { get; set; }
public Repository(DbContext dbContext)
{
this.dbContext = dbContext;
this.dbSet = this.dbContext.Set<TEntity>();
}
public void Delete(int id)
{
TEntity entity = dbSet.Find(id);
dbSet.Remove(entity);
dbContext.SaveChanges();
}
public void DisplayAll()
{
IQueryable Query = from item in dbContext.Set<TEntity>()
where true
select item;
foreach (DbSet<TEntity> x in Query) //InvalidCastException
{
// print entity fields to console here.
}
}
}
这些是我用于创建存储库对象的主程序中的行:
TestDataBaseEntities 是我用来引用我的实体模型的DbContext对象的类型。
class Program
{
static void Main(string[] args)
{
int myID;
var dbEntities = new TestDatabaseEntities();
Repository<Man> ManTracker = new Repository<Man>(dbEntities);
ManTracker.Display(); // exception thown in this method.
Console.WriteLine("Choose ID to delete from Men list");
myID = int.Parse(Console.ReadLine());
ManTracker.Delete(myID);
ManTracker.Display();
Console.ReadLine();
}
}
答案 0 :(得分:0)
我想我找到了答案。我在每个声明中都使用了错误的类型。
而不是做DbSet我应该使用TEntity。
但这是误导性的,因为即使我能够对TEntity进行类型转换,我也需要有代码来打印TEntity对象的字段,而TEntity无法访问我需要打印的字段。我认为我应该使用一个定义一个名为display的函数的接口,而不是使用一个单独的存储库类,并以某种方式由每个实体类实现,而无需修改自动生成的代码从数据库创建模型。也许通过创建从实体类继承的类,然后实现接口。我有这样做的想法,因为为了保持面向对象,我觉得对象不应该依赖另一个对象向用户显示它的内容,它本身应该显示它们。