0

发布编辑 - 请参阅下面的编辑

我对用作 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 可能很大。每次我将帖子带入系统时,我都不需要它。我会有一个单独的查询来计算这类信息。

谁能帮我解决最后一部分?谢谢你的时间。

4

1 回答 1

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 ......

于 2011-09-28T19:53:58.753 回答