使用Entity Framework 5 Code First时,使用Table Per Hierarchy。 这与存储库和工作单元相结合(尝试了几种实现)。 我遇到以下错误:
(34,10):错误3032:从第19,34行开始映射片段时出现问题:EntityTypes T,T被映射到表T中的相同行。映射条件可用于区分这些类型的行被映射到。
我已使用以下指南解决了此问题: Entity Framework 4.3 - TPH mapping and migration error
当使用所有记录的一般查找,然后没有错误时,这是有效的。
使用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();
}
}
答案 0 :(得分: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);
});
}
}
答案 1 :(得分: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时我遇到了这个问题,我认为已经改变的是鉴别器数据库列在EF 5.0中不可为空。我认为让它们变得不可空是更有意义的,一般而言,每个派生类型只有一个discrimanotor列而不是每个类型一个列(就像在EF 4.3中那样)可能更好。
-Stan