Entity framework EF将记录的子集存储到另一个表中
我有一个标题子表,子表具有不同的类型,但存储在同一个表(TPH)中 除此之外,用户还可以对标头及其子记录的副本进行快照,我希望将快照的副本存储到另一个表中,因为查看/修改这些快照记录的频率较低 为了实现这一点,我将TPC与我现有的TPH混合 新的结构如下:Entity framework EF将记录的子集存储到另一个表中,entity-framework,Entity Framework,我有一个标题子表,子表具有不同的类型,但存储在同一个表(TPH)中 除此之外,用户还可以对标头及其子记录的副本进行快照,我希望将快照的副本存储到另一个表中,因为查看/修改这些快照记录的频率较低 为了实现这一点,我将TPC与我现有的TPH混合 新的结构如下: public class Header { private IList<Child> _childs = new List<Child>(); private IList<ChildSnapsho
public class Header
{
private IList<Child> _childs = new List<Child>();
private IList<ChildSnapshot> _childSnapshots = new List<ChildSnapshot>();
[Key]
public int Id { get; set; }
public string Name { get; set; }
public IList<Child> Childs { get { return _childs; } }
public IList<ChildSnapshot> ChildSnapshots { get { return _childSnapshots; } }
}
public abstract class ChildBase
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
public string Name { get; set; }
[ForeignKey("Header")]
public int HeaderId { get; set; }
[ForeignKey("HeaderId")]
public virtual Header Header { get; set; }
}
public abstract class Child : ChildBase
{
}
public class Child1 : Child
{
}
public class Child2 : Child
{
}
public abstract class ChildSnapshot : ChildBase
{
}
public class ChildSnapshot1 : ChildSnapshot
{
}
public class ChildSnapshot2 : ChildSnapshot
{
}
公共类标题
{
private IList_childs=新列表();
私有IList_childSnapshots=新列表();
[关键]
公共int Id{get;set;}
公共字符串名称{get;set;}
公共IList Childs{get{return\u Childs;}}
public IList ChildSnapshots{get{return\u ChildSnapshots;}}
}
公共抽象类儿童库
{
[关键]
[数据库生成(DatabaseGeneratedOption.None)]
公共int Id{get;set;}
公共字符串名称{get;set;}
[外键(“标题”)]
public int HeaderId{get;set;}
[外键(“HeaderId”)]
公共虚拟头{get;set;}
}
公共抽象类Child:ChildBase
{
}
公共类儿童1:儿童
{
}
公共类儿童2:儿童
{
}
公共抽象类ChildSnapshot:ChildBase
{
}
公共类ChildSnapshot 1:ChildSnapshot
{
}
公共类ChildSnapshot 2:ChildSnapshot
{
}
以及数据库上下文:
public class TestContext : DbContext
{
public DbSet<Header> Headers { get; set; }
public DbSet<Child> Childs { get; set; }
public DbSet<ChildSnapshot> ChildSnapshots { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Header>().Map(m => m.ToTable("Header"));
modelBuilder.Entity<Child>()
.Map<Child>(m =>
{
m.MapInheritedProperties();
m.ToTable("Child");
})
.Map<Child1>(m =>
{
m.Requires("Discriminator").HasValue("Child1");
})
.Map<Child2>(m =>
{
m.Requires("Discriminator").HasValue("Child2");
});
modelBuilder.Entity<ChildSnapshot>()
.Map<ChildSnapshot>(m =>
{
m.MapInheritedProperties();
m.ToTable("ChildSnapshot");
})
.Map<ChildSnapshot1>(m =>
{
m.Requires("Discriminator").HasValue("Child1");
})
.Map<ChildSnapshot2>(m =>
{
m.Requires("Discriminator").HasValue("Child2");
});
}
}
公共类TestContext:DbContext
{
公共数据库集头{get;set;}
公共DbSet Childs{get;set;}
公共数据库集子快照{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity().Map(m=>m.ToTable(“Header”);
modelBuilder.Entity()
.Map(m=>
{
m、 MapInheritedProperties();
m、 可折叠(“儿童”);
})
.Map(m=>
{
m、 需要(“鉴别器”)。HasValue(“Child1”);
})
.Map(m=>
{
m、 需要(“鉴别器”)。HasValue(“Child2”);
});
modelBuilder.Entity()
.Map(m=>
{
m、 MapInheritedProperties();
m、 ToTable(“儿童快照”);
})
.Map(m=>
{
m、 需要(“鉴别器”)。HasValue(“Child1”);
})
.Map(m=>
{
m、 需要(“鉴别器”)。HasValue(“Child2”);
});
}
}
经过多次尝试和错误,它工作得非常完美。然而,我必须在Header类中创建两个列表属性。是否只能有一个ChildBase类型的列表属性?当我这样做时,我得到了以下错误
无法按定义映射类型“Child”,因为它映射的是继承的
使用实体拆分或其他形式的
遗产或者选择不同的继承映射策略,以便
至于不映射继承的属性,或更改
映射继承属性和不使用拆分的层次结构
为什么行为由容器列表的类型决定?EF不能从列表中的对象类型推断吗
仅供参考,我正在使用EF 4.3。您可能需要添加示例来演示您迄今为止所做的工作。有关详细信息,请参阅。感谢您的建议,已经添加了我的代码示例。您可能希望添加示例来演示您迄今为止所做的工作。有关详细信息,请参阅。感谢您的建议,已添加我的代码示例。