【发布时间】:2013-10-17 06:56:24
【问题描述】:
首先使用实体框架代码我有这个:
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
【问题讨论】:
-
你是先做代码,所以你是从代码的角度思考。但我认为您应该问问自己,您希望如何在数据库中表示它。考虑架构,然后回到代码中,看看应该如何完成。
-
@AKhudairy 我更新了一个可能的数据结构。不知道好不好。
-
每个人可以有一个笔记?。我不知道什么适合您的业务需求。我会添加两个连接表,一个是 Prodcut_Note,一个是 Person_Note,以启用表之间的多对多关系。我们在另一个站点有类似的情况,其中 dba 选择将一个列映射到两个表,但在这种情况下,您将无法拥有外键约束,我不喜欢这种方法
-
每个人可以有n条笔记。看起来你没有很好地阅读结构。
-
哦,我现在明白了(我没有看到您使用 NoteData 的去向)...好的,请查看我的回复帖子,并使用下面的示例代码
标签: c# asp.net-mvc database entity-framework ef-code-first