首先使用实体框架代码我有这个:
public class Person {
public int PersonId {get;set;}
public string FirstName {get;set;}
public string LastName {get;set;}
public virtual List<Note> Notes {get;set;}
}
public class Product {
public int ProductId {get;set;}
public string Name {get;set;}
public virtual List<Note> Notes {get;set;}
}
public class Note {
public int NoteId {get;set;}
public string Body {get;set;}
public virtual User Author {get;set;}
// what should be here ?
}
我如何知道注释是来自 Person 还是 Product ?我应该为此需要不同的类(PersonNote、ProductNote)吗?我可以使用接口方法吗?喜欢 INoteable 吗?
我不确定要建模的数据库或类的最佳策略是什么。任何建议表示赞赏。
谢谢,
编辑(基于答案)
建议的答案意味着对于每个有注释的实体,表格都会有一个我不太喜欢的新列。有没有办法使用鉴别器?我不喜欢每次新实体可以有注释时都修改表的想法,如果我有 10 个支持注释的实体,则可能最终得到 10 个 FK(9 个始终为空)。
理想情况下,我希望拥有类似接口(或其他任何东西)的东西,这样我就可以在代码中拥有 Product : INoteable ,这意味着可以使用此 ID 创建注释。也许有一个鉴别器列。这甚至可能吗?
很抱歉第一次没有说清楚。
在现实生活场景中,我喜欢:产品、人员、采购订单、销售、付款、付款订单,以及一些我需要实现注释的实体。
编辑 2:
这个数据库结构怎么样:
TABLE: Note
int PK NoteId
int FK NoteDataId
string Body
TABLE: Person
int PK PersonId
int FK NoteDataId
TABLE: Product
int PK ProductId
int FK NoteDataId
TABLE: NoteData
int PK NoteDataId
使用这种数据结构,所有想要实现 Notes 的实体我只需添加一个导航属性 NoteDataId,在创建便笺时,我只需给出 NoteDataId 值。我认为如果 NoteDataId 行不存在,EF 将负责创建它。
编辑 3:
示例数据:
Person:
PersonId 1
Name Bart
NoteDataId 1
PersonId 2
Name Alex
NoteDataId 2
Product:
ProductId 1
Name "Dulce de Leche"
NoteDataId 3
NoteData:
NoteDataId 1
NoteDataId 2
NoteDataId 3
Note:
NoteId 1
NoteDataId 1
Body "first note"
NoteId 2
NoteDataId 1
Body "second note of Bart"
NoteId 3
NoteDataId 2
Body "first note of Alex"
NoteId 4
NoteDataId 3
Body "Note about Dulce de Leche"
如何获取某人的笔记?
SELECT * FROM Note
JOIN NoteData USING (NoteDataId)
JOIN Person USING (NoteDataId)
WHERE PersonId = 1
倒退?
SELECT * FROM Note
JOIN NoteData USING (NoteDataId)
LEFT JOIN Person USING (NoteDataId) 'can be null, only one type exists'
LEFT JOIN Product using (NoteDataId) 'can be null, only one type exists'
WHERE NoteId = 2