Я пытаюсь смоделировать сценарий, в котором я наследую конкретные базовые классы в сторонней библиотеке, а затем сопоставляю свои собственные классы с помощью Entity Framework Code First. Я действительно предпочел бы, чтобы мои классы имели то же простое имя, что и базовые классы. Я, очевидно, не могу изменить имена базовых классов, а также не могу изменить базовый класс на абстрактный. Как и ожидалось, я получаю следующую ошибку:
Тип «EfInheritanceTest.Models.Order» и тип «EfInheritanceTest.Models.Base.Order» имеют одно и то же простое имя «Order» и поэтому не могут использоваться в одной и той же модели. Все типы в данной модели должны иметь уникальные простые имена. Используйте NotMappedAttribute или вызовите Ignore в свободном API Code First, чтобы явно исключить свойство или тип из модели.
Насколько я понимаю, в EF6 это возможно, пока фактически отображается только один из классов. Однако, если я попытаюсь игнорировать базовый класс, используя свободный API, вместо этого я получу следующую ошибку:
Тип «EfInheritanceTest.Models.Order» не сопоставлен. Убедитесь, что тип не был исключен явным образом с помощью метода Ignore или аннотации данных NotMappedAttribute. Убедитесь, что тип был определен как класс, не является примитивным или универсальным и не наследуется от EntityObject.
... что, по-видимому, указывает на то, что, игнорируя базовый класс, я также игнорирую любые подклассы. Полный код ниже. Есть ли способ обойти это и «не игнорировать» подкласс? Или это ограничение сопоставления типов EF?
namespace EfInheritanceTest.Models.Base
{
public class Order
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual decimal Amount { get; set; }
}
}
namespace EfInheritanceTest.Models
{
public class Order : Base.Order
{
public virtual DateTime OrderDate { get; set; }
}
}
namespace EfInheritanceTest.Data
{
public class OrdersDbContext : DbContext
{
public OrdersDbContext() : base ("OrdersDbContext") { }
public IDbSet<EfInheritanceTest.Models.Order> Orders { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Types<Models.Base.Order>().Configure(c => c.Ignore());
modelBuilder.Types<Models.Order>().Configure(c => c.ToTable("order"));
modelBuilder.Entity<Models.Order>().Map(c =>
{
c.MapInheritedProperties();
c.ToTable("order");
});
}
}
}
base.OnModelCreating(modelBuilder);
. Кажется, работает для меня. - person DavidG   schedule 18.07.2014Ignore
без вызоваbase.OnModelCreating
? - person nickwesselman   schedule 18.07.2014