0

我有如下代码。

  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();
        }

任何人都可以帮忙吗?

4

1 回答 1

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");
    });
于 2012-05-17T11:05:11.723 回答