После некоторого копания, я обнаружил, что это возможно, на самом деле, я не уверен, так как какая версия, но она работает как шарм на EF5.
Решение вышеуказанной ошибки заключается в том, чтобы сопоставить отношение вручную с Fluent API. Слой ТПТА требует:
- отношения наследования между двумя классами
- Тем же первичным ключом на оба таблицах, и для таблицы унаследованного типа внешнего ключа первичного ключа.
Вот определение классов:
[Table("Persons", Schema="MySchema")]
public partial class Person
{
public int PersonId { get; set; }
public string Name { get; set; }
}
[Table("Users", Schema = "MySchema")]
partial class User : Person
{
}
TPH слой, кажется, не работает, просто добавив поле «дискриминатор». Найденное решение:
- Добавление поля «UserType» в базу данных.
- Составьте карту, используя Fluent API.
Важно отметить, что поле «UserType» не может быть включено в определение класса или вы получите ошибку выше.
public class CustomUser : User
{
}
Внутри класса DbContext на OnModelCreating переопределения:
modelBuilder.Entity<User>().Map<User>(m =>
{
m.ToTable("Users");
m.Requires("UserType").HasValue("User");
}).Map<CustomUser>(m =>
{
m.Requires("UserType").HasValue("CustomUser");
});
Наконец, имея такой код в DbContext не очень многоразовые, поэтому я переехал его внутри класса EntityTypeConfiguration следующим образом :
public class CustomUserConfiguration : EntityTypeConfiguration<CustomUser>
{
public CustomUserConfiguration()
{
Map<CustomUser>(m => m.Requires("UserType").HasValue("CustomUser"));
}
}
DbContext теперь может использовать немного отражения, чтобы загрузить все классы EntityTypeConfiguration
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
MethodInfo addMethod = typeof(ConfigurationRegistrar).GetMethods().Single(m => m.Name == "Add" && m.GetGenericArguments().Any(a => a.Name == "TEntityType"));
IList<Assembly> assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.GetName().Name.StartsWith("System") && !a.GetName().Name.StartsWith("Microsoft")).ToList();
foreach (Assembly assembly in assemblies)
{
IList<Type> types = assembly.GetTypes().Where(t => t.BaseType != null && t.BaseType.IsGenericType && t.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>)).ToList();
foreach (Type type in types)
{
Type entityType = type.BaseType.GetGenericArguments().Single();
object entityConfig = assembly.CreateInstance(type.FullName);
addMethod.MakeGenericMethod(entityType).Invoke(modelBuilder.Configurations, new object[] { entityConfig });
}
}
}