Entity Framework 5コードを最初に使用する場合、階層ごとのテーブルを使用します。これは、リポジトリおよび作業単位と組み合わされます(いくつかの実装を試しました)。次のエラーが発生します:
(34,10):エラー3032:19、34行目から始まるフラグメントのマッピングの問題:EntityTypes T、TがテーブルTの同じ行にマッピングされています。マッピング条件を使用して、これらのタイプがマッピングされる行を区別できます。 。
次のガイドを使用してこの問題を解決しました: Entity Framework4.3-TPHマッピングと移行エラー
これは、すべてのレコードの一般的なルックアップを使用する場合に機能し、エラーは発生しません。
を使用するDBSet<T>.Find(id)
と、上記のエラーメッセージが表示されます。
すべてを使用すると正常にDBSet<T>.Where(t => t.id == id)
動作します。
誰かがこの問題の解決策を持っていますか?
public class TDataContext : DbContext
{
// Models
public abstract class BaseTrackable
{
public DateTime DateModified { get; set; }
}
public abstract class ParentClass : BaseTrackable
{
public int ParentId { get; set; }
public string ParentString { get; set; }
}
public class Foo : ParentClass
{
public string FooString { get; set; }
}
public class Bar : ParentClass
{
public string BarString { get; set; }
}
// Configuration
public class ParentConfiguration : EntityTypeConfiguration<ParentClass>
{
public ParentConfiguration()
{
ToTable("Parent");
}
}
public class FooConfiguration : EntityTypeConfiguration<Foo>
{
public FooConfiguration()
{
Map(m => m.Requires("FooIndicator").HasValue(true));
}
}
public class BarConfiguration : EntityTypeConfiguration<Bar>
{
public BarConfiguration()
{
Map(m => m.Requires("BarIndicator").HasValue(true));
}
}
public DbSet<ParentClass> Parent { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations
.Add(new ParentConfiguration())
.Add(new FooConfiguration())
.Add(new BarConfiguration());
}
}
public class Controller
{
TDataContext _context = new TDataContext();
// Repository function
public T GetById<T>(object id) where T : class
{
var dbset = _context.Set<T>();
return dbset.Find(id);
}
public IQueryable<TDataContext.Foo> GetFiltered(Expression<Func<TDataContext.Foo, bool>> filter)
{
var dbset = _context.Set<TDataContext.Foo>();
return dbset.Where(filter);
}
// Final call
// Which fails..
public TDataContext.Foo Get(int id)
{
return this.GetById<TDataContext.Foo>(id);
}
// This works...
public TDataContext.Foo GetWhere(int id)
{
return this.GetFiltered(f => f.ParentId == id).FirstOrDefault();
}
}