如何在c# .net core EF中使用子id和子类型创建一个实体和其他实体类型之间的关系?



我想在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;}
}

Child1Child2类的属性是相同的,为什么要创建两个单独的类?对单个类这样做不是可以吗?

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();
}

最新更新