带有条件的实体框架一对多映射

本文关键字:一对多 映射 框架 实体 有条件 | 更新日期: 2023-09-27 18:17:10

我有以下结构在我的DBMS (mysql):

create table tasks
(
    id int auto_increment not null,
        primary key (id),
    name varchar(200) not null,
        unique(name)    
);
create table species
(
    id int auto_increment not null,
        primary key (id),
    id_task int,
        foreign key (id_task) references tasks(id) on delete cascade,
    is_history tinyint not null default 0
);

一个任务可以有当前物种(当is_history=0)和历史物种(当is_history=1)。我创建了以下类:

public class Specie
{
    public int Id { get; set; }
    public int TaskId { get; set; }
    public Task ParentTask { get; set; }
}
public class Task
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Specie> CurrentSpecies { get; set; }
    public ICollection<Specie> HistSpecies { get; set; }
}

用代码优先创建映射的正确方法是什么将"CurrentSpecies"answers"HistSpecies"映射到一个表"species"中,其中一个字段"is_history"存在差异?

带有条件的实体框架一对多映射

你可以像这样创建Species类:

public class Specie
{
    public int Id { get; set; }
    public int TaskId { get; set; }
    public Task ParentTask { get; set; }
    public ICollection<Specie> CurrentSpecies { get; set; }
    public ICollection<Specie> HistSpecies { get; set; }
}

如果你必须创建Task对象和这个对象中的集合,那么我建议你重新考虑你的设计。从本质上讲,任务对象应该成为聚合根。

我也会考虑使用Fluent Api进行复杂的映射,因为它提供了一些灵活性。你可以在这里查看:

Fluent Api示例