EF6 - BaseClass数据复制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF6 - BaseClass数据复制相关的知识,希望对你有一定的参考价值。

我有一个基类A和派生类BB是我最近的迁移中介绍的。我正在寻找Table-per-Type遗产。一个B可以有许多As。我在尝试使用update-database时遇到的错误与A.Designation上的索引有关,因为数据库由Seed方法填充。我确实理解这个错误的来源,但我不知道如何避免它。

基类:

[Table("As")]
class A
{
    [Key]
    public Id { get; set; }

    [Index(IsUnique = true)]
    public string Designation { get; set; }

    // This is mapped via EF and required by Bs constructor
    public ICollection<SomeType> SomeType { get; set; }

    // Parameter less constructor for EntityFramework
    private A() { }

    public A(string designation)
    {
        Designation = designation;
    }
}

派生类:

[Table("Bs")]
class B : A 
{
    public B(A a) : base(a.designation)
    {
         foreach (SomeType someType in A.SomeTypes)
         {
             // Do something
         }
    }
}

因此,在Seed方法中,首先是aA实例,然后将基于bB实例a添加到DB中。据我所知,调用new B(a)创建了一个新的A实例,它也被添加到因为唯一索引而失败的数据库中。

我该如何避免这种情况?

我想要引用数据,而不是重复。我想有可能使用Table-per-Hierarchy方案但是会复制每个AB数据(对吗?),我想避免,特别是因为A.SomeEntities也会复制其条目。

刚刚出现在我脑海中的另一种可能性是将a的Id传递给b的构造函数,但那将需要调用DbContext并且可能暗示我现在缺少的其他一些奇怪之处。

答案

看起来您正在尝试链接现有对象而不是类继承?

为什么不在b和a之间建立链接?

   [Table("Bs")]
    class B
    {
public A referredA {get;set;}
        public B(A a) 
        {
           referredA=a;
        }
    }

以上是关于EF6 - BaseClass数据复制的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 指针和“智能指针”

是否扩展接口,何时基类已经扩展了相同的接口

关于c#中internal用法

EF6 级联对象的设置速度非常慢

EF6(代码优先)单个外键属性上的多个导航属性

有趣的 C++ 代码片段,有啥解释吗? [复制]