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