Entity framework EntityFramework如何不映射类而映射它';继承的财产
我们在web mvc应用程序(StdWebApp)中使用EntityFramework 6.1和CodeFirst。现在,我们要创建此应用程序的新自定义版本(CustomWebApp)。 CustomWebApp将使用标准应用程序的大部分代码,在其域模型中,它将扩展Person类。 在CustomDomain中,我们实现了一个新的DbContext,它必须连接到定制应用程序(CustomSqlDb)的数据库 在(C#)代码中,域和CustomDomain中都有一个人是没有问题的。但是,我们无法为自定义DbContext中的人员设计映射,该映射将:Entity framework EntityFramework如何不映射类而映射它';继承的财产,entity-framework,ef-code-first,mapping,Entity Framework,Ef Code First,Mapping,我们在web mvc应用程序(StdWebApp)中使用EntityFramework 6.1和CodeFirst。现在,我们要创建此应用程序的新自定义版本(CustomWebApp)。 CustomWebApp将使用标准应用程序的大部分代码,在其域模型中,它将扩展Person类。 在CustomDomain中,我们实现了一个新的DbContext,它必须连接到定制应用程序(CustomSqlDb)的数据库 在(C#)代码中,域和CustomDomain中都有一个人是没有问题的。但是,我们无法为
modelBuilder.Entity<Person>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("Person");
}
);
public DbSet<CustomDomain.Person> People {get; set;}
modelBuilder.Entity().Map(m=>
{
m、 MapInheritedProperties();
m、 可转让(“人”);
}
);
用这份文件作为我们的灵感
但英孚抱怨说,这个简单的名字是平等的。
显然,我们可以将“CustomDomain”中的“Person”重命名为“PersonCustom”,但如果将来我们不得不再次这样做,例如“PersonCustomExtraSpecial”等,这可能会导致许多愚蠢的名字
有人吗
更新
我们尝试了mr100建议的解决方案,下面是完整的代码:
namespace Domain
{
public class Person
{
public int Id { get; set; }
public string Stuff { get; set; }
}
}
namespace CustomDomain
{
public class Person : Domain.Person
{
public string ExtraStuff { get; set; }
}
}
namespace CustomDomain
{
public class DbModel : DbContext
{
DbSet<CustomDomain.Person> Persons { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<CustomDomain.Person>().Map(m => m.ToTable("Person"));
}
}
}
命名空间域
{
公共阶层人士
{
公共int Id{get;set;}
公共字符串填充{get;set;}
}
}
命名空间自定义域
{
公共类人员:域.人员
{
公共字符串{get;set;}
}
}
命名空间自定义域
{
公共类DbModel:DbContext
{
DbSet Persons{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().Map(m=>m.ToTable(“Person”);
}
}
}
这仍然会导致错误
类型“CustomDomain.Person”和类型“Domain.Person”都具有相同的简单名称“Person”,因此不能在同一模型中使用。给定模型中的所有类型都必须具有唯一的简单名称。在Code First fluent API中使用“NotMappeAttribute”或调用Ignore可从模型中显式排除属性或类型
因此,我们添加了以下代码:
namespace CustomDomain
{
public class DbModel : DbContext
{
DbSet<CustomDomain.Person> Persons { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Ignore<Domain.Person>();
modelBuilder.Entity<CustomDomain.Person>().Map(m => m.ToTable("Person"));
}
}
}
命名空间自定义域
{
公共类DbModel:DbContext
{
DbSet Persons{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
Ignore();
modelBuilder.Entity().Map(m=>m.ToTable(“Person”);
}
}
}
仍然是相同的结果。要实现这一点,CustomWebApps中的DbContext类应具有如下定义的属性人员:
modelBuilder.Entity<Person>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("Person");
}
);
public DbSet<CustomDomain.Person> People {get; set;}
public DbSet-People{get;set;}
无财产:
public DbSet<Domain.Person> People {get; set;}
public DbSet-People{get;set;}
即使它来自StdWebApp DbContext类,CustomWebApp DbContext类也可以从中派生(如果您是这样的话)。此外,您还可以正确设置表名:
modelBuilder.Entity<Person>().ToTable("Person");
modelBuilder.Entity().ToTable(“个人”);
@Humayun Awesome edit;-)我们尝试了您的答案,请参阅更新的问题,但仍会出现相同的错误。如果它对你有效,你能在你的答案中包含示例代码吗?不幸的是,你将要实现的目标在当前版本的EF中是不可能的。EF不识别名称空间,并且它总是在模型中包含基类型,您不能使用Ignore将其删除。检查此链接以供参考:那里的家伙们声明EF团队最终将在第7版中删除此限制。目前,恐怕解决您问题的唯一办法是将Domain.Person或CustomDomain.Person类重命名为其他名称。