EF多对多无法加载一端

时间:2012-05-17 10:28:01

标签: entity-framework many-to-many

我的代码如下。

  class Student : IPeople
{
    private string name;
    public string Name
    {
        get { return name;}
        set { name = value;}
    }

    private bool sex;
    public bool Sex
    {
        get{ return sex; }
        set{ sex = value;}
    }

    private int age;
    public int Age
    {
        get{return age;}
        set{age = value;}
    }

    public virtual ICollection<Dog> dogs { get;set; }

    public Student()
    {
        dogs = new List<Dog>();
    }
}

class Pet
{
    string Name { get; set; }
    bool Sex { get; set; }
    int Age{get;set;}
}

class Dog : Pet
{
    public string Type { get; set; }
    public virtual ICollection<IPeople> persons { get; set; }

    public Dog()
    {
        persons = new List<IPeople>();
    }
}

上下文是

class TestContext : DbContext
{
    public DbSet<Student> studentSet { get; set; }
    public DbSet<Dog> dogSet { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Student>().HasMany(x => x.dogs).WithMany(y => (ICollection<Student>)y.persons);
    }
}

如果我插入下面的记录,

using (TestContext context = new TestContext())
        {
            Student s = new Student();
            s.Age = 18;
            s.Sex = true;
            s.Name = "ts";
            Dog d = new Dog();
            d.Type = "abc";
            d.Sex = false;
            d.Name = "dog";
            d.Age = 3;
            s.dogs.Add(d);
            context.studentSet.Add(s);
            context.SaveChanges();
        }

一切正常,但如果我插入下面的记录,学生记录将不会插入数据库。

using (TestContext context = new TestContext())
        {
            Student s = new Student();
            s.Age = 18;
            s.Sex = true;
            s.Name = "ts";
            Dog d = new Dog();
            d.Type = "abc";
            d.Sex = false;
            d.Name = "dog";
            d.Age = 3;
            d.persons.Add(s);
            context.dogSet.Add(d);
            context.SaveChanges();
        }

任何人都可以提供帮助吗?

1 个答案:

答案 0 :(得分:3)

您无法在此处使用界面IPeople

public virtual ICollection<IPeople> persons { get; set; }

导航属性必须引用模型的实体 - 抽象或具体 -

可能的替代方法可能是使用抽象类People而不是接口。但你必须把导航属性......

public virtual ICollection<Dog> dogs { get;set; }

...进入那个抽象类,而不是派生的Student类,因为Dog.persons引用了抽象类People,类似于:

abstract class People
{
    // ...
    public virtual ICollection<Dog> dogs { get;set; }
}

class Student : People
{
    // ...
}

class Pet
{
    // ...
}

class Dog : Pet
{
    // ...
    public virtual ICollection<People> persons { get; set; }
}

映射将是:

modelBuilder.Entity<People>()
    .HasMany(x => x.dogs)
    .WithMany(y => y.persons)
    .Map(m =>
    {
        m.ToTable("PeoplesDogs");
        m.MapLeftKey("PeopleId");
        m.MapRightKey("DogId");
    });
相关问题