我试图创建一个表来保存关于特定实体的注释。我有一个名为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;
这似乎应该可以在数据库中使用,但我对该模型没有任何好运。有人可以帮助我指出正确的方向吗?
答案 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; }
}
注意每个子类如何引用正确的父对象。
您的Lot
和Task
类需要更改以反映更改:
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
。
此功能称为“每层次结构表继承”。您可以谷歌搜索以获取有关它的更多信息。