2011-09-26 78 views
0

POST编辑 - 见下文流利Automapper问题与标签创建

编辑我有一个流畅的自动映射其作为夏普架构的一部分查询。运行其中一个测试用例将生成一个模式,我可以使用它在我的数据库中创建表。

我正在开发一个帖子,以及与这些帖子相关的标签。我希望标签能够与多个帖子相关联,并且每个帖子都有0个或多个标签。

我想实现的DB模式:

邮政{ID,标题,SubmitTime,内容}

标签{ID,名称}

PostTag {帖子ID,标签识别}

相反,我得到:

发表的内容{Id,Title,SubmitTime,Content}

标记{ID,名称,帖子ID(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架构等都很陌生,所以任何帮助都会非常感谢!

编辑 *

OK,我现在已经稍微调整我的班。我的问题是我期待推断中间表。相反,我意识到我必须创造它。 所以我现在(我已经简化了类稍有提高可读性的缘故:

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 
} 

这让我对与通常的邮政和变量表沿着中间实体的模式:

PostTag{id, name, PostId(FK)} 

上面的问题是,它仍然不包含Tag的外键,而且它应该真的有一个ID列,因为它是一个关系表?我认为它应该是一个组合键,它由来自Post和Tag表格的PK。

我敢肯定,通过向Tag类

IList<PostTag> postList 

我会得到另一个FK加入PostTag模式,但我不想添加上面,作为postList可能是巨大的。我不需要每次向系统中添加帖子。我会有一个单独的查询来计算这种信息。

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

回答

0

好吧,我一直认为模拟域中的复合类是前进的方向,但我终于遇到了一些automapper覆盖代码,它创建了复合表,而无需创建类这,这是什么,我首先想到的问题:

公共类PostMappingOverride :IAutoMappingOverride { 公共无效覆盖(自动映射图) {

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