标签创建时流畅的Automapper问题

时间:2011-09-26 16:01:56

标签: automapper fluent sharp-architecture

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可能很大。每次我把帖子带进系统时我都不需要它。我会有一个单独的查询来计算那种信息。

任何人都可以帮我解决这最后一部分吗?谢谢你的时间。

1 个答案:

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