带有条件的实体框架一对多映射
本文关键字:一对多 映射 框架 实体 有条件 | 更新日期: 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示例