C# EF代码优先:反规范化继承的类型
我拥有以下实体: Human -Name -Age -Height -Weight 人类 -名字 -年龄 -高度 -重量 超人 -超级大国 EF正在创建仅具有Power属性的SuperHumans表,并且在查询时连接到Humans表。我要超人表上的所有列C# EF代码优先:反规范化继承的类型,c#,entity-framework,entity-framework-4.1,ef-code-first,code-first,C#,Entity Framework,Entity Framework 4.1,Ef Code First,Code First,我拥有以下实体: Human -Name -Age -Height -Weight 人类 -名字 -年龄 -高度 -重量 超人 -超级大国 EF正在创建仅具有Power属性的SuperHumans表,并且在查询时连接到Humans表。我要超人表上的所有列 EF 4.1代码是否可以首先配置为执行此操作?执行此操作的一种方法是将关系设置为Has-a关系,而不是is-a关系 public class SuperHuman { public Human TheHuman { get; s
EF 4.1代码是否可以首先配置为执行此操作?执行此操作的一种方法是将关系设置为Has-a关系,而不是is-a关系
public class SuperHuman
{
public Human TheHuman { get; set; }
public string SuperPower { get; set; }
}
生成的数据库表应该包含所有的Human和SuperHuman字段(只要您没有单独的Human表,在这种情况下,将创建一个单独的Human表,并添加一个外键将这些表链接在一起)
它的实用性有限,因为它破坏了继承。你可能会找到更好的解决办法
编辑:您可以执行以下操作:
public class SuperHuman : Human
{
public string Name
{
get { return base.Name; }
set { base.Name = value; }
}
}
注意:这没有经过测试,可能不是最好的解决方案。我把它包括在这里只是作为一个可能的解决方案。难道不让人类部分工作吗??如果这不起作用,只需查看每个层次结构的表、每个类型的表和每个具体类型的表(TPH、TPT、TPC)。您当前正在使用TPT,并且希望使用TPC。我只需要将超人配置为映射继承属性,如下所示:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<SuperHuman>().Map(m => m.MapInheritedProperties());
{
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().Map(m=>m.MapInheritedProperties());
{
不幸的是,我确实有一个Humans表。我不介意在应用程序中破坏继承。好建议。我想要两个不同的实体。哦,我明白了。然后放入partial并继续使用TPT。我相信这应该可以做到。不过,公平地说,我已经有一段时间没有这样做了:P。让我知道。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<SuperHuman>().Map(m => m.MapInheritedProperties());
{