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

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 和外部关键。

显然 GradePerson 有 one-to-many 关系:每个 Person 有零个或多个 Grades,每个 Grade恰好属于一个 Person.

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

在您的其他数据库中,Grade 与您第一个数据库中的 Grade 不同。等级不是 PersonGrade,它是 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");
     }
}