从Entity.DynamicProxies.MyEntityClass到Entity.DbSet`1 [MyEntityClass]的InvalidCastException

时间:2012-10-18 19:25:54

标签: c# entity-framework

我很难理解为什么我会收到InvalidCastException 以下是我收到的错误消息:

  

无法将“System.Data.Entity.DynamicProxies.Man_58184D79075BC811252680D7866D3D69D0C46FD038D3B123A5E3B102E1FC77A2”类型的对象强制转换为“System.Data.Entity.DbSet`1 [ConsoleApplication1.Man]”。

  • 是传递给TEntity
  • 的实体类的名称
  • 我在代码中用注释标记了错误的位置。

此存储库类的目的是保存给定的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();
    }
}

1 个答案:

答案 0 :(得分:0)

我想我找到了答案。我在每个声明中都使用了错误的类型。

而不是做DbSet我应该使用TEntity。

但这是误导性的,因为即使我能够对TEntity进行类型转换,我也需要有代码来打印TEntity对象的字段,而TEntity无法访问我需要打印的字段。我认为我应该使用一个定义一个名为display的函数的接口,而不是使用一个单独的存储库类,并以某种方式由每个实体类实现,而无需修改自动生成的代码从数据库创建模型。也许通过创建从实体类继承的类,然后实现接口。我有这样做的想法,因为为了保持面向对象,我觉得对象不应该依赖另一个对象向用户显示它的内容,它本身应该显示它们。