我想在Task实体和子实体之间创建一个直接关系,以便与任务一起获得相应的子实体,并且当我获得子实体时获得相应的任务。
我有一个名为Task的实体,我需要将它与其他实体类型one21关联起来。我的解决方案是在任务实体中为子id和子类型分别创建一个属性:
public class Task
{
public int Id { get; set; }
public int ChildId { get; set; }
public int TaskTypeId { get; set; }
public Child1 Child1{ get; set; }
public Child2 Child2{ get; set; }
}
public class Child1
{
public int Id { get; set; }
public Task Task{get; set;}
}
public class Child2
{
public int Id { get; set; }
public Task Task {get; set;}
}
Child1
和Child2
类的属性是相同的,为什么要创建两个单独的类?对单个类这样做不是可以吗?
public class Task
{
public int Id { get; set; }
public int TaskTypeId { get; set; }
public IEnumerable<Child1> Childs{ get; set; }
}
public class Child1
{
public int Id { get; set; }
public int TaskId { get; set; }
public Task Task { get; set; }
}
按照约定配置关系:https://www.entityframeworktutorial.net/efcore/conventions-in-ef-core.aspx
因此命名很重要更改任务模型中的外键:
public class Task
{
public int Id { get; set; }
public int TaskTypeId { get; set; }
public int Child1Id { get; set; }
public Child1 Child1{ get; set; }
public int Child2Id { get; set; }
public Child2 Child2{ get; set; }
}
可选的解决方案,通过Fluent API配置的关系:https://www.entityframeworktutorial.net/efcore/fluent-api-in-entity-framework-core.aspxIEntityTypeConfiguration。
public class Task
{
public int Id { get; set; }
public int ChildId { get; set; }
public int TaskTypeId { get; set; }
public Child1 Child1{ get; set; }
public Child2 Child2{ get; set; }
}
public class Child1
{
public int Id { get; set; }
public Task Task{get; set;}
}
public class Child2
{
public int Id { get; set; }
public Task Task {get; set;}
}
ientitytypconfiguration的实现:
internal class Child1DbConfig : IEntityTypeConfiguration<Child1>
{
public void Configure(EntityTypeBuilder<Child1> entity)
{
entity.ToTable("Child1");
entity.HasKey(c => c.Id);
entity.HasOne(d => d.Task)
.WithOne(p => p.Child1)
.HasForeignKey(d => d.TaskId);
}
}
不要忘记在添加/编辑IEntityTypeConfiguration接口后进行新的迁移。
Also:也许为你的Task类选择另一个名字。Task已经是系统中的一个类名。线程的名称空间。因此,如果你使用任何异步的东西,你迟早会遇到麻烦。
感谢CodeCaster纠正我的(错误)答案!
我以前也面临同样的问题,所以由于这是一对一的表,我建议您使用[Own]实体,它将映射同一表中的所有内容作为父表并消除头痛。
public class Task
{
public int Id { get; set; }
public int ChildId { get; set; }
public int TaskTypeId { get; set; }
public Child1 Child1{ get; set; }
public Child2 Child2{ get; set; }
}
[Owned]
public class Child1
{
public int Id { get; set; }
public Task Task{get; set;}
}
[Owned]
public class Child2
{
public int Id { get; set; }
public Task Task {get; set;}
}
否则,如果您希望它们在单独的表中,并且希望从子表中查询它们,也可以将Child.Id
同时作为PK和FK,并引用Task
表。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Task>()
.HasOne(e => e.Child1)
.WithOne(e => e.Task)
.HasForeignKey<Child1>(e => e.Id)
.IsRequired();
modelBuilder.Entity<Task>()
.HasOne(e => e.Child2)
.WithOne(e => e.Task)
.HasForeignKey<Child2>(e => e.Id)
.IsRequired();
}