首先是EF代码,子代码包含父对象列表

时间:2017-06-28 05:53:20

标签: c# sqlite ef-code-first polymorphism

我首先需要一些帮助才能解决EF代码的问题。我有Student继承自Person。学生可以拥有像Worker这样的朋友,这些朋友也可以从人那里继承。

class Person
{
    public int Id { get; set; }
    //...
}

class Student : Person
{
    public virtual List<Person> Friends { get; set; }
    //...
}

class Worker : Person
{
    //there are other classes like this one
}

如果我尝试将实体写入我的sqlite DB,这是我得到的例外:

  

具有身份的成员&#39; PersonSelf&#39;在元数据集合中不存在。

如果我将列表更改为Worker,则表明它正常,但不是Person。 我可以改变什么来解决这个问题?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

你应该没有任何问题如果你已经很好地定义了你的模型和数据库上下文了。我在github上创建了一个小型仓库来测试你的模型。链接在这里  github repo 我的模型非常简单:

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

}
public class Student : Person
{
    public Student()
    {
        Friends=new List<Person>();
    }
    public virtual List<Person> Friends { get; set; }
    public int StudentAge { get; set; }
}
public class Worker : Person
{
    public decimal WorkerSalary { get; set; }
}

我正在使用DotNet Core,我能够创建数据库并插入数据。

请检查回购并让我知道它是否适合您。

答案 1 :(得分:0)

谢谢您的提示。要解决此问题,您需要告诉EF在DB中创建映射表。原因是因为这是一个“多对多”的问题。

请另请考虑我的其他post

    public class ModelConfiguration
    {
        private static void ConfigureGridDataCollectionEntity(DbModelBuilder modelBuilder)
        {
            // Student
            modelBuilder.Entity<Student>()
                .HasMany(p => p.Friends)
                .WithMany()
                .Map(cs =>
                {
                    cs.MapLeftKey("StudentId");
                    cs.MapRightKey("FriendsId");
                    cs.ToTable("StudentFriend");
                });
        }
    }