我的代码如下。
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();
}
任何人都可以提供帮助吗?
答案 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");
});