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

私は答えを理解したと思います。foreachステートメントで間違ったタイプを使用していました。

DbSetを実行する代わりに、代わりにTEntityを使用する必要がありました。

しかし、これは誤解を招く恐れがあります。TEntityに型キャストできたとしても、TEntityオブジェクトのフィールドを出力するコードが必要であり、TEntityは印刷する必要のあるフィールドにアクセスできないからです。個別のリポジトリクラスを使用する代わりに、displayという関数を定義するインターフェイスを使用する必要があり、データベースからモデルを作成することで自動生成されたコードを変更せずに、各エンティティクラスによって実装されます。おそらく、エンティティクラスから継承するクラスを作成してから、インターフェイスを実装します。オブジェクト指向を維持するために、オブジェクトがそのコンテンツをユーザーに表示するために別のオブジェクトに依存するのではなく、オブジェクト自体を表示する必要があるので、このようにすることを考えました。

于 2012-10-21T17:12:56.960 に答える