两个上下文,相同的表,其中一些需要更改 - 其他保持不变
Two contexts, same tables, needs to change in some of them - other stay the same
我有两个项目依赖于两个不同的数据库上下文。项目首先使用 EF 代码。事情是上下文有多个(准确地说是 5 个)公共 tables。所以使用相同的 class 来创建实体。问题是现在这个 class 需要为其中一个上下文更改(columns/propertys 要添加),但对另一个上下文保持不变。
例如我有:
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;}
}
对于 table 中的 IPeopleSecondGroupDbContxt
数据库上下文 Person
应该在不更改 IPeopleFirstGroupDbContxt
和人员 table 的情况下添加新的与爱好的一对多关系在 IPeopleFirstGroupDbContxt
。
- 在这种情况下,我无法使 Person class 抽象并继承它,因为这种一对多关系不起作用。它只是在 Hobiie class 中创建新列,但并没有完全创建关系。
- 第二次机会只是从 Person -> NewPerson 继承,而不是将其抽象化,但这将通过 PersonId
在这两个 table 之间创建关系
有什么想法吗?
你是对的,关系数据库不能很好地处理继承,因此如果你想使用继承,entity framework 必须解决它。
问题是您的 DbSet classes 包含表示表中列的属性(真实信息),还有表示表之间关系的属性:ICollection 和外部关键。
显然 Grade
与 Person
有 one-to-many 关系:每个 Person
有零个或多个 Grades
,每个 Grade
恰好属于一个 Person
.
在你的其他数据库中你没有 Persons
,你有 ExtendedPersons
。 ExtendedPersons
与 Persons
非常相似,例如,每个 ExtendedPerson
都有零个或多个等级。但是,ExtendededPersons
还有更多内容。 ExtendedPersons
还有 Hobbies
和 Books
。由于与 Persons
相似,您决定使用继承。
在您的其他数据库中,Grade
与您第一个数据库中的 Grade
不同。等级不是 Person
的 Grade
,它是 ExtendedPerson
.
的等级
如果您不想创建单独的 ExtendedGrade
class,您需要流利的 API 来告知 entity framework 这种不同的关系。最好的方法是在 OnModelCreating
中使用流利的 API,这不会影响您的基本 classes
人物:
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);
}
}
你的另一个 DbContext:
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");
}
}
我有两个项目依赖于两个不同的数据库上下文。项目首先使用 EF 代码。事情是上下文有多个(准确地说是 5 个)公共 tables。所以使用相同的 class 来创建实体。问题是现在这个 class 需要为其中一个上下文更改(columns/propertys 要添加),但对另一个上下文保持不变。
例如我有:
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;}
}
对于 table 中的 IPeopleSecondGroupDbContxt
数据库上下文 Person
应该在不更改 IPeopleFirstGroupDbContxt
和人员 table 的情况下添加新的与爱好的一对多关系在 IPeopleFirstGroupDbContxt
。
- 在这种情况下,我无法使 Person class 抽象并继承它,因为这种一对多关系不起作用。它只是在 Hobiie class 中创建新列,但并没有完全创建关系。
- 第二次机会只是从 Person -> NewPerson 继承,而不是将其抽象化,但这将通过 PersonId
有什么想法吗?
你是对的,关系数据库不能很好地处理继承,因此如果你想使用继承,entity framework 必须解决它。
问题是您的 DbSet classes 包含表示表中列的属性(真实信息),还有表示表之间关系的属性:ICollection 和外部关键。
显然 Grade
与 Person
有 one-to-many 关系:每个 Person
有零个或多个 Grades
,每个 Grade
恰好属于一个 Person
.
在你的其他数据库中你没有 Persons
,你有 ExtendedPersons
。 ExtendedPersons
与 Persons
非常相似,例如,每个 ExtendedPerson
都有零个或多个等级。但是,ExtendededPersons
还有更多内容。 ExtendedPersons
还有 Hobbies
和 Books
。由于与 Persons
相似,您决定使用继承。
在您的其他数据库中,Grade
与您第一个数据库中的 Grade
不同。等级不是 Person
的 Grade
,它是 ExtendedPerson
.
如果您不想创建单独的 ExtendedGrade
class,您需要流利的 API 来告知 entity framework 这种不同的关系。最好的方法是在 OnModelCreating
人物:
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);
}
}
你的另一个 DbContext:
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");
}
}