1

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

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

  • 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();
    }
}
4

1 回答 1

0

我想我找到了答案。我在 for each 语句中使用了错误的类型。

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

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

于 2012-10-21T17:12:56.960 回答