POST已编辑 - 请参阅下面的编辑
我有一个关于FLuent Automapping的查询,它被用作SHarp架构的一部分。运行其中一个测试用例将生成一个模式,我可以使用该模式在我的数据库中创建表。
我正在开发一个包含帖子的网站,以及与这些帖子相关的标签。我希望标签能够与多个帖子相关联,并且每个帖子都有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;
}
}
我可以看到为什么它的数据库模式设置已经消失了,因为有时候某个对象只能作为另一个对象的一部分存在。但标签可以单独存在。
我将如何实现这一目标?我对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可能很大。每次我把帖子带进系统时我都不需要它。我会有一个单独的查询来计算那种信息。
任何人都可以帮我解决这最后一部分吗?谢谢你的时间。
答案 0 :(得分:0)
好的,我被认为在域中建模复合类是前进的方法,但我终于遇到了一些自动化覆盖代码,它创建了复合表,而我不需要为它创建类,这是我首先期待的:
公共类PostMappingOverride :IAutoMappingOverride { public void Override(AutoMapping map) {
map.HasManyToMany(e => e.TagList)
.Inverse()
.Cascade.SaveUpdate();
}
}
现在这将给我我的架构(以下架构非简化):
create table Posts (
Id INT not null,
PublishTime DATETIME null,
SubmitTime DATETIME null,
PostTitle NVARCHAR(255) null,
Content NVARCHAR(255) null,
primary key (Id)
)
create table Posts_Tags (
PostFk INT not null,
TagFk INT not null
)
create table Tags (
Id INT not null,
Name NVARCHAR(255) null,
primary key (Id)
)
alter table Posts_Tags
add constraint FK864F92C27E2C4FCD
foreign key (TagFk)
references Tags
alter table Posts_Tags
add constraint FK864F92C2EC575AE6
foreign key (PostFk)
references Posts
我认为投掷者是我一直在寻找一对多的关系,就是这样,但在这里被称为HasManytoMAny ......