导航属性的复合键

时间:2015-10-31 00:53:02

标签: c# entity-framework ef-code-first foreign-key-relationship

我试图创建一个表来保存关于特定实体的注释。我有一个名为Notes的实体,我想存储它所引用的实体的PK。我想要一个密钥的复合键和包含主键的表名。请参阅以下示例:

public class Lot
{
    public int LotId { get; set; }
    public virtual ICollection<Note> Notes { get; set; }
}
public class Task
{
    public int TaskId { get; set; }
    public virtual ICollection<Note> Notes { get; set; }
}

public class Note
{
    public int Id { get; set; }
    public int EntityReferenceId { get; set; }

    public string EntityType { get; set; }
    public string Comment {get; set; }
}

所以在Notes表中会有:

Id:1 EntityReferenceId:1 EntityType:Lot Comment:&#34; Comment one,Lot one&#34;

Id:2 EntityReferenceId:1 EntityType:Lot Comment:&#34; Comment two,Lot one&#34;

Id:3 EntityReferenceId:1 EntityType:Task Comment:&#34; Comment one,task one&#34;

这似乎应该可以在数据库中使用,但我对该模型没有任何好运。有人可以帮助我指出正确的方向吗?

1 个答案:

答案 0 :(得分:0)

使Note类抽象,并创建两个派生类,一个用于批量注释,另一个用于任务注释,如下所示:

public abstract class Note
{
    public int Id { get; set; }

    public string Comment {get; set; }
}

public class NoteForLot : Note
{
    public int LotId { get; set; }
    public virtual Lot Lot { get; set; }
}

public class NoteForTask : Note
{
    public int TaskId { get; set; }
    public virtual Task Task { get; set; }
}

注意每个子类如何引用正确的父对象。

您的LotTask类需要更改以反映更改:

public class Lot
{
    public int LotId { get; set; }
    public virtual ICollection<NoteForLot> Notes { get; set; }

    public Lot()
    {
        Notes = new HashSet<NoteForLot>();
    }
}

public class Task
{
    public int TaskId { get; set; }
    public virtual ICollection<NoteForTask> Notes { get; set; }

    public Task()
    {
        Notes = new HashSet<NoteForTask>();
    }
}

Entity Framework将自动在notes表中创建一个列(以替换您的EntityType属性)以区分这两种注释。此列将在数据库中调用Discriminator

此功能称为“每层次结构表继承”。您可以谷歌搜索以获取有关它的更多信息。