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

时间:2014-08-09 13:05:25

标签: c# mysql entity-framework ef-code-first

我的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”和“HistSpecies”映射到一个表“species”中,并且在一个字段“is_history”中存在差异?

1 个答案:

答案 0 :(得分:0)

您可以像这样创建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 Example