Nhibernate 映射多对多关系(按代码映射)时出现问题

Nhibernate 映射多对多关系(按代码映射)时出现问题,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我正在使用一个新的到NHibernate 3.2的代码映射(不是流利的NHibernate),我在映射多对多关系方面有一个小问题 我想映射这些实体 public class Article { public virtual Guid Id { set; get; } public virtual string Content { set; get; } public virtual string Title { set; get; }

我正在使用一个新的到NHibernate 3.2的代码映射(不是流利的NHibernate),我在映射多对多关系方面有一个小问题

我想映射这些实体

 public class Article
    {
        public virtual Guid Id { set; get; }
        public virtual string Content { set; get; }
        public virtual string Title { set; get; }
        public virtual IList<Tag> Tags { set; get; }
    }
 public class Tag
    {
        public virtual Guid Id { set; get; }
        public virtual string Name { set; get; }
        public virtual IList<Article> Articles { set; get; }
    }

    public class ArticleTag
    {
        public virtual Article Article { set; get; }
        public virtual Tag Tag { set; get; }
    }
公共类文章
{
公共虚拟Guid Id{set;get;}
公共虚拟字符串内容{set;get;}
公共虚拟字符串标题{set;get;}
公共虚拟IList标记{set;get;}
}
公共类标签
{
公共虚拟Guid Id{set;get;}
公共虚拟字符串名称{set;get;}
公共虚拟IList项目{set;get;}
}
公共类ArticleTag
{
公共虚拟项目{set;get;}
公共虚拟标记{set;get;}
}
我的地图看起来像

  public class TagMapping : ClassMapping<Tag>
        {
            public TagMapping()
            {
                Id<Guid>(x => x.Id);
                Property<string>(x => x.Name);
                Bag<Article>(x => x.Articles, x => x.Inverse(true), x => x.ManyToMany(z =>
                {
                    z.Column("Article");
                    z.Lazy(LazyRelation.Proxy);
                }));
            }
        }
        public class ArticleTagMapping : ClassMapping<ArticleTag>
        {
            public ArticleTagMapping()
            {
                ManyToOne<Article>(x => x.Article, x => { });
                ManyToOne<Tag>(x => x.Tag, x => { });
            }
        }
       public class ArticleMapping : ClassMapping<Article>
        {
            public ArticleMapping()
            {
                Id<Guid>(x => x.Id, x => x.Generator(Generators.Guid));
                Property<string>(x => x.Content, x => x.Length(4002));
                Property<string>(x => x.Title);
                Bag<Tag>(x => x.Tags, x =>{ }, x => x.ManyToMany(z =>
                {
                    z.Column("Tag");
                    z.Lazy(LazyRelation.Proxy);
                }));
            }
        }
公共类标记映射:类映射
{
公共标记映射()
{
Id(x=>x.Id);
属性(x=>x.Name);
袋子(x=>x.物品,x=>x.逆(真),x=>x.多个(z=>
{
z、 栏(“条款”);
z、 Lazy(LazyRelation.Proxy);
}));
}
}
公共类ArticleTagMapping:类映射
{
public ArticleTagMapping()
{
ManyToOne(x=>x.Article,x=>{});
ManyToOne(x=>x.Tag,x=>{});
}
}
公共类ArticleMapping:类映射
{
公共地图()
{
Id(x=>x.Id,x=>x.Generator(Generators.Guid));
属性(x=>x.Content,x=>x.Length(4002));
属性(x=>x.Title);
袋子(x=>x.Tags,x=>{},x=>x.manytomy(z=>
{
z、 列(“标签”);
z、 Lazy(LazyRelation.Proxy);
}));
}
}
唯一的问题是,当我使用这个模式在数据库中生成表时,我有两个额外的表。要禁用生成这两个表(项目和标记),我必须更改什么?
你真的需要这个吗

 public class ArticleTagMapping : ClassMapping<ArticleTag>
        {
            public ArticleTagMapping()
            {
                ManyToOne<Article>(x => x.Article, x => { });
                ManyToOne<Tag>(x => x.Tag, x => { });
            }
        }
公共类ArticleTagMapping:ClassMapping
{
public ArticleTagMapping()
{
ManyToOne(x=>x.Article,x=>{});
ManyToOne(x=>x.Tag,x=>{});
}
}

你真的需要这个吗

 public class ArticleTagMapping : ClassMapping<ArticleTag>
        {
            public ArticleTagMapping()
            {
                ManyToOne<Article>(x => x.Article, x => { });
                ManyToOne<Tag>(x => x.Tag, x => { });
            }
        }
公共类ArticleTagMapping:ClassMapping
{
public ArticleTagMapping()
{
ManyToOne(x=>x.Article,x=>{});
ManyToOne(x=>x.Tag,x=>{});
}
}

我已经想好了,如果我删除这个映射,数据库表图表就会像我想要的那样。但我不想在代码1:1中有关系。我希望在代码中有相同的情况,这意味着n:m关系被划分为三个实体。我不希望出现这样的情况,例如customer:company关系,现在我需要添加一个DateTime对象来检查customer何时与公司关联。我有一个问题,如何恰当地映射这个关系。就我所见,这不是一个N:M(这是DB级别),但我猜你最后看到的是两个1:N类型的关系。客户(1)-(N)公司\客户(N)-(1)公司。您的想法是什么?…遇到这样一种情况:您的关系似乎是多对多的关系,但“联接表”其中包含额外的非ID数据列。这不是真正的多对多关系。事实上,这是一个三元关系。另一种看待它的方式是两个主表和中间表之间的两个OTM/MTO关系(即具有额外信息的“联接表”)。您可以从逻辑上将其视为一个多对多关系,但您应该将其建模为一个三元关系。“从我已经计算出的结果来看,如果删除此映射,数据库表图表将看起来像我想要的那样。但我不想在代码1:1中有关系。我希望在代码中有相同的情况,这意味着n:m关系被划分为三个实体。我不希望出现这样的情况,例如customer:company关系,现在我需要添加一个DateTime对象来检查customer何时与公司关联。我有一个问题,如何恰当地映射这个关系。就我所见,这不是一个N:M(这是DB级别),但我猜你最后看到的是两个1:N类型的关系。客户(1)-(N)公司\客户(N)-(1)公司。您的想法是什么?…遇到这样一种情况:您的关系似乎是多对多的关系,但“联接表”其中包含额外的非ID数据列。这不是真正的多对多关系。事实上,这是一个三元关系。另一种看待它的方式是两个主表和中间表之间的两个OTM/MTO关系(即具有额外信息的“联接表”).你可以从逻辑上把它看作一种多对多关系,但你应该把它建模为一种三元关系