Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF将记录的子集存储到另一个表中_Entity Framework - Fatal编程技术网

Entity framework EF将记录的子集存储到另一个表中

Entity framework EF将记录的子集存储到另一个表中,entity-framework,Entity Framework,我有一个标题子表,子表具有不同的类型,但存储在同一个表(TPH)中 除此之外,用户还可以对标头及其子记录的副本进行快照,我希望将快照的副本存储到另一个表中,因为查看/修改这些快照记录的频率较低 为了实现这一点,我将TPC与我现有的TPH混合 新的结构如下: public class Header { private IList<Child> _childs = new List<Child>(); private IList<ChildSnapsho

我有一个标题子表,子表具有不同的类型,但存储在同一个表(TPH)中

除此之外,用户还可以对标头及其子记录的副本进行快照,我希望将快照的副本存储到另一个表中,因为查看/修改这些快照记录的频率较低

为了实现这一点,我将TPC与我现有的TPH混合

新的结构如下:

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。

您可能需要添加示例来演示您迄今为止所做的工作。有关详细信息,请参阅。感谢您的建议,已经添加了我的代码示例。您可能希望添加示例来演示您迄今为止所做的工作。有关详细信息,请参阅。感谢您的建议,已添加我的代码示例。