0

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

2 に答える 2

0

私の問題を部分的に解決する何かを見つけました...

テーブルに別のインジケーターを追加する場合、エラーは発生しません。例:

public class FooConfiguration : EntityTypeConfiguration<Foo>
    {
        public FooConfiguration()
        {
            Map(m => {
                m.Requires("FooIndicator").HasValue(true);
                m.Requires("BarIndicator").HasValue<short>(1);
            });
        }
    }

    public class BarConfiguration : EntityTypeConfiguration<Bar>
    {
        public BarConfiguration()
        {
            Map(m => {
                m.Requires("BarIndicator").HasValue(true);
                m.Requires("FooIndicator").HasValue<short>(0);
            });
        }
    }
于 2012-08-20T20:11:11.170 に答える
0

良くないだろう

public class FooConfiguration : EntityTypeConfiguration<Foo> 
{ 
    public FooConfiguration() 
    { 
        Map(m => m.Requires("Type").HasValue("Foo")); 
    } 
} 

public class BarConfiguration : EntityTypeConfiguration<Bar> 
{ 
    public BarConfiguration() 
    { 
        Map(m => m.Requires("Type").HasValue("Bar"); 
    } 
}

このように、FooConfigurationはBarConfigurationについて何も知る必要はなく、その逆も同様です。EF 4.3から5.0に移行するときにこの問題が発生しましたが、変更されたのは、EF5.0ではディスクリミネーターデータベースの列がnull許容されないことでした。null許容型ではない方がはるかに理にかなっていると思います。一般に、型ごとに1つの列ではなく、派生型ごとに1つのdiscrimanotor列だけを使用する方がよい場合があります(EF 4.3の場合のように)。

-スタン

于 2012-09-04T13:29:07.103 に答える