【发布时间】:2021-11-03 17:37:15
【问题描述】:
注意:我的数据库已经用 sql 编写,EF 设置不会影响 SQL 对象的实际创建。
我正在尝试创建其他项目可以继承的“基础”上下文和模型,希望基础上下文和模型不需要修改,而是随着其他关系的建立而扩展。这是我目前的尝试
文件 1:
namespace BaseProject.Models {
public class ClassA {
public int Id { get;set; }
public string Value { get; set; }
public void DoConfiguring(ModelBuilder modelBuilder) {
// do setup to define the key and table
}
}
}
文件 2:
namespace ProjectB.Models {
public class ClassA: BaseProject.Models.ClassA {
public ClassC NavPropertyToAnotherClass { get; set; }
public void DoConfiguring(ModelBuilder modelBuilder) {
// do setup for nav property here
}
}
}
在这种情况下,BaseProject 的所有模型都已配置,然后 ProjectB 的所有模型都已配置。我希望将所有数据都保存在 1 个表中,如 ClassA 配置中定义的那样。我没有添加任何其他列或信息。我只是希望能够像使用 ClassA 一样使用 ClassB,但需要设置额外的导航属性。
我遇到了鉴别器问题和其他一些正在停止的小问题。是我的设置错误,还是这种类型的问题目前无法通过继承和 EF Core 解决。
编辑: 最终目标是能够在建立新关系时向继承的模型添加导航属性,以便基本模型和实体几乎可以保持不变。
另一种尝试来解释我的设想。
//----------- File ---------------//
namespace BaseProject.Models {
public class Person {
public int Id { get;set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int? ParentOneId { get; set; }
public int? ParentTwoId { get; set; }
public Person ParentOne { get; set; }
public Person ParentTwo { get; set; }
public ICollection<Person> ChildrenOne { get; set; }
public ICollection<Person> ChildrenTwo { get; set; }
public void OnModelCreating(ModelBuilder modelBuilder) {
var builder = modelBuilder.Entity<Person>();
builder.HasMany(l => l.ChildrenOne)
.WithOne(co => co.ParentOne)
.HasForeignKey(co => co.ParentOneId);
builder.HasMany(l => l.ChildrenTwo)
.WithOne(co => co.ParentTwo)
.HasForeignKey(co => co.ParentTwoId);
builder.ToTable("dbo", "Person");
builder.HasKey(f => f.Id);
}
}
}
//--------------------------//
//----------- File ---------------//
namespace BaseProject.Contexts {
public class BaseContext : DbContext {
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
new Person().OnModelCreating(modelBuilder);
base.OnModelCreating(modelBuilder);
}
}
}
//--------------------------//
//----------- File ---------------//
namespace ExtraCurricularProject.Models {
public class ExtraCurricular {
public int Id { get; set; }
public string Name { get; set; }
// other stuff
public ICollection<PersonExtraCurricular> PersonExtraCurriculars { get; set; }
public void OnModelCreating(ModelBuilder modelBuilder) {
var builder = modelBuilder.Entity<ExtraCurricular>();
builder.ToTable("dbo", "ExtraCurricular");
builder.HasKey(f => f.Id);
}
}
}
//----------------------------//
//----------- File ---------------//
namespace ExtraCurricularProject.Models {
public class Person : BaseProject.Models.Person {
public ICollection<PersonExtraCurricular> PersonExtraCurriculars { get; set; }
public void OnModelCreating(ModelBuilder modelBuilder) {
}
}
}
//--------------------------//
//----------- File ---------------//
namespace ExtraCurricularProject.Models {
public class PersonExtraCurricular {
public int PersonId { get; set; }
public int ExtraCurricularId { get; set; }
public Person Person { get; set; }
public ExtraCurricular ExtraCurricular { get; set; }
public void OnModelCreating(ModelBuilder modelBuilder) {
var builder = modelBuilder.Entity<PersonExtraCurricular>();
builder.HasOne(pec => pec.Person)
.WithMany(p => p.PersonExtraCurriculars)
.HasForeignKey<PersonExtraCurricular>(pec => pec.PersonId);
builder.HasOne(pec => pec.ExtraCurricular)
.WithMany(ec => ec.PersonExtraCurriculars)
.HasForeignKey<PersonExtraCurricular>(pec => pec.ExtraCurricularId);
builder.ToTable("dbo", "PersonExtraCurricular");
builder.HasKey(pec => new { pec.PersonId, pec.ExtraCurricularId });
}
}
}
//--------------------------//
//----------- File ---------------//
namespace ExtraCurricularProject.Contexts {
public class ExtraCurricularContext : BaseContext {
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
new Person().OnModelCreating(modelBuilder);
new ExtraCurricular().OnModelCreating(modelBuilder);
new PersonExtraCurricular().OnModelCreating(modelBuilder);
base.OnModelCreating(modelBuilder);
}
}
}
//--------------------------//
尝试使用这种类型的模式它说我需要一个鉴别器,但我不想让 BaseProject.Models.Person 和 ExtraCurricularProject.Models.Person 带回不同的数据,我只想要 ExtraCurricularProject.Models.Person能够访问那些其他导航属性。
【问题讨论】:
-
这些
DoConfiguring方法在哪里运行?目前尚不清楚这两个类是否都已配置。 (假设第二个ClassA实际上是ClassB)。 -
我添加了另一个尝试,看看它是否能更好地捕捉到我想象的映射方式
标签: c# entity-framework-core entity-relationship entity-relationship-model