代码之家  ›  专栏  ›  技术社区  ›  Nick

Fluent NHibernate映射没有主键的联接表

  •  1
  • Nick  · 技术社区  · 7 年前

    我有一个现有的数据库,它有三个表、两个实体表和一个链接表。两个实体表中的每一个都有一个主键id。一个使用int,另一个使用guid。联接表包含两列,即每个表的主键。所以,大致看起来是这样的:

    表1:问题 Id-主键,int

    表2:资产 Id-主键,guid

    表3:问题资产

    资产-(PK,FK guid)

    问题-(PK,FK,int)

    我的课程设置如下:

    public class NQuestion
    {
        public virtual int Id { get; set; }
        ...
        public virtual IList<NQuestionAsset> Assets { get; set; }
    }
    
    public class NQuestionAsset
    {
        public virtual NAsset Asset { get; set; }
        public virtual NQuestion Question { get; set; }
    }
    
    public class NAsset
    {
        public virtual Guid Id { get; set; }
        ...
    }
    
    public class QuestionMap : ClassMap<NQuestion>
    {
        public QuestionMap()
        {
            Table("Question");
            LazyLoad();
    
            Id(q => q.Id).GeneratedBy.Identity().Column("Id");
            ...
            HasManyToMany(x => x.Assets).Table("QuestionAsset")
                .ParentKeyColumns.Add("Asset", "Question")
                .Not.LazyLoad();
         }
     }
    
     public class QuestionAssetMap : ClassMap<NQuestionAsset>
        {
        public QuestionAssetMap()
        {
            Table("QuestionAsset");
            LazyLoad();
    
            CompositeId().KeyProperty(a => a.Asset, "Id").KeyProperty(a => a.Question, "QuestionId");
    
            References(a => a.Asset.Id).Column("Asset");
            References(a => a.Question.QuestionId).Column("Question");
        }
    }
    
    public class AssetMap : ClassMap<NAsset>
    {
        public AssetMap()
        {
            Table("Asset");
            LazyLoad();
    
            Id(q => q.Id).GeneratedBy.GuidComb().Column("Id");
            ...
        }
    }
    

    我尝试了比我愿意承认的更多的关系迭代来填充链接表。我如何定义这种关系?我无法更改数据库。

    无法确定:问题的类型。模型NHibernate。NAsset,Question,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null,对于列:NHibernate。映射。列(Id)

    1 回复  |  直到 7 年前
        1
  •  1
  •   Radim Köhler user2134822    7 年前

    • 配对表 有自己的
    • 只有两列,外键

    介绍配对对象,以及

    public class NQuestion
    {
        public virtual int Id { get; set; }
        ...
        //public virtual IList<NQuestionAsset> Assets { get; set; }
        public virtual IList<Asset> Assets { get; set; }
    

    HasManyToMany

    public QuestionMap()
    {
        ...
        HasManyToMany(x => x.Assets)
             .Table("QuestionAsset")
             .ParentKeyColumn("Asset")
             .ChildKeyColumn("Question")
             ...;
    

    在此处查看更多信息