发布编辑 - 请参阅下面的编辑
我对用作 SHARP 架构的一部分的 Fluent Automapping 有疑问。运行其中一个测试用例将生成一个模式,我可以使用它在我的数据库中创建表。
我正在开发一个带有帖子的网站,以及与这些帖子相关的标签。我希望一个标签能够与多个帖子相关联,并且每个帖子都有 0 个或多个标签。
我想实现以下数据库模式:
发布{Id、标题、提交时间、内容}
标签 {Id, Name}
PostTag {PostId,TagId}
相反,我得到:
发布{Id、标题、提交时间、内容}
标签 {Id, Name, PostID (FK)}
我正在使用清晰的架构,并且类可能如下所示(或多或少):
public class Post : Entity
{
[DomainSignature]
private DateTime _submittime;
[DomainSignature]
private String _posttitle;
private IList<Tag> _taglist;
private String _content;
public Post() { }
public Post(String postTitle)
{
_submittime = DateTime.Now;
_posttitle = postTitle;
this._taglist = new List<Tag>();
}
public virtual DateTime SubmitTime { get { return _submittime; } private set { _submittime = value; } }
public virtual string PostTitle { get { return _posttitle; } private set { _posttitle = value; } }
public virtual string Content { get { return _content; } set { _content = value; } }
public virtual IList<Tag> TagList { get { return _taglist; } set { _taglist = value; } }
public class Tag : Entity
{
[DomainSignature]
private String _name;
public Tag() { }
public Tag(String name)
{
this._name = name;
}
public virtual String Name
{
get { return _name; }
private set { _name = value; }
}
public virtual void EditTagName(String name)
{
this.Name = name;
}
}
我可以看到为什么它没有设置它所拥有的 DB 模式,因为有时一个对象只能作为另一个对象的一部分存在。但是一个标签可以单独存在。
我将如何实现这一目标?我对 MVC、Nhibernate 和 SHARP 架构等很陌生,所以任何帮助都将不胜感激!
编辑*
好的,我现在稍微调整了我的课程。我的问题是我期望推断中间表。相反,我意识到我必须创造它。所以我现在有了(为了便于阅读,我稍微简化了这些类。:
class Post : Entity
{
[DomainSignature]
String Title
[DomainSignature]
DateTime SubmitTime
IList<PostTag> tagList
}
class Tag : Entity
{
[DomainSignature]
string name
}
class PostTag : Entity
{
[DomainSignature]
Post post
[DomainSignature]
Tag tag
}
这为我提供了中间实体的架构以及通常的 Post 和 Tag 表:
PostTag{id, name, PostId(FK)}
上面的问题是它仍然不包含 Tag 的外键。另外,它真的应该有一个 ID 列,因为它是一个关系表吗?我认为它实际上应该是一个复合键,由 Post 和 Tag 表中的 PK 组成。
我确信通过添加到 Tag 类
IList<PostTag> postList
我将在 PostTag 架构中添加另一个 FK,但我不想添加上述内容,因为 postList 可能很大。每次我将帖子带入系统时,我都不需要它。我会有一个单独的查询来计算这类信息。
谁能帮我解决最后一部分?谢谢你的时间。