两个上下文,相同的表,需要更改其中一些 - 其他保持不变



我有两个项目依赖于两个不同的数据库上下文。项目首先使用 EF 代码。事情是上下文有多个(确切地说是 5)公共表。因此,使用相同的类来创建实体。问题是现在这个类需要为其中一个上下文更改(要添加的列/属性),但对另一个上下文保持不变。

例如,我有:

public interface IPeopleFirstGroupDbContxt 
{
IDbSet<Person> Person {get; set;}
IDbSet<Grade> Grades {get; set;}
IDbSet<Book> Books {get; set;}
} 
public interface IPeopleSecondGroupDbContxt 
{
IDbSet<Person> Person {get; set;}
IDbSet<Grade> Grades {get; set;}
IDbSet<Book> Books {get; set;}
IDbSet<Hobbie> Hobbies {get; set;}
IDbSet<School> Schools {get; set;}
} 
public class Person(
{
public Person()
{
this.Grades = new HashSet<Grade>();
this.Books= new HashSet<Book>();
}
[Key]
public int PersonId {get; set;}
public string FirstName {get; set;}
public ICollection Grades {get; set;}
public ICollection Books{get; set;}
}

对于表中的IPeopleSecondGroupDbContxt数据库上下文Person应该添加与爱好的新一对多关系,而无需更改IPeopleFirstGroupDbContxt中的IPeopleFirstGroupDbContxt和人员表。 - 在这种情况下,我无法使 Person 类抽象并继承它,因为这种一对多关系不起作用。它只是在 Hobiie 类中创建新列,但并没有完全创建关系。 - 第二次机会只是从 Person -> NewPerson 继承,而不会使其抽象,但这将通过 PersonId 在这两个表之间创建关系

有什么想法吗?

你是对的,关系数据库不能很好地处理继承,因此如果你想使用继承,实体框架必须解决它。

问题在于,DbSet 类包含表示表中列的属性(实际信息),但也包含表示表之间关系的属性:ICollection 和外键。

显然,GradePerson有一对多关系:每个Person都有零个或多个Grades,每个Grade都只属于一个Person

在您的其他数据库中,您没有Persons,您有ExtendedPersonsExtendedPersonsPersons非常相似,例如,每个ExtendedPerson都有零个或多个等级。但是,ExtendededPersons还有更多的东西。ExtendedPersons也有HobbiesBooks.由于与Persons相似,您决定使用继承。

在其他数据库中,Grade与第一个数据库中的Grade不同。A级不是PersonGrade,而是ExtendedPerson的等级。

如果不想创建单独的ExtendedGrade类,则需要流畅的 API 来通知实体框架有关此不同关系的信息。不会干扰基本类的最佳方法是在OnModelCreating中使用流畅的 API

相关人员:

class Person
{
public int Id {get; set;}
// every Person has zero or more PersonGrades (one-to-many
public virtual ICollection<Grade> Grades {get; set;}
... // other properties
}
class ExtendedPerson : Person
{
// inherits primary key and Grades from Person
// every ExtendedPerson has zero or more Hobbies (one-to-many)
public virtual ICollection<Hobby> Hobbies {get; set;}
...
}

成绩和爱好:

class Grade
{
public int Id {get; set;}
// every Grade belongs to exactly one (subclass of) Person using foreign key
public int PersonId {get; set;}
public virtual Person Person {get; set;}
}
class Hobby
{
public int Id {get; set;}
// every Hobby belongs to exactly one ExtendedPerson using foreign key
public int ExtendedPersonId {get; set;}
public virtual ExtendedPerson ExtendedPerson {get; set;}
}

您的第一个 DbContext:

public MyDbContext : DbContext
{
public DbSet<Person> Persons {get; set;}
public DbSet<Grade> Grades {get; set;}   
public override void OnModelCreating(...)
{
// a person has zero or more Grades,
// every Grade belongs to exactly one Person
// using foreign key PersonId
modelBuilder.Entity<Person>()
.HasMany(person => person.Grades)
.WithRequired(grade => grade.Person)
.HasForeignKey(grade => grad.PersonId);
}
}

您的其他数据库上下文:

public MyOtherDbContext : DbContext
{
public DbSet<ExtendePerson> ExtendedPersons {get; set;}
public DbSet<Grade> Grades {get; set;}   
public DbSet<Hobby> Hobbies {get; set;}
public override void OnModelCreating(...)
{
// every extended person has zero or more Grades
// every Grade belongs to exactly one Person
// using foreign key PersonId
modelBuilder.Entity<ExtendedPerson>()
.HasMany(extendedPerson => extendedPerson.Grades)
.WithRequired(grade => grade.Person)
.HasForeignKey(grade => grade.PersonId);
// every extended person has zero or more hobbies
// every hobby belongs to exactly one ExtendedPerson
// using foreign  key ExtendedPersonId
modelBuilder.Entity<ExtendedPerson>()
.HasMany(extendedPerson => extendedPerson.Hobbies)
.WithRequired(hobby => hobby.ExtendedPerson)
.HasForeignKey(hobby => hobby.ExtendedPersonId);
// proper table name for hobbies:
modelBuilder.Entity<Hobby>().ToTable("Hobbies");
}
}

最新更新