Fluent NHibernate 映射没有主键的连接 table

Fluent NHibernate Mapping a join table without a primary key

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

Table 1: 问题 Id - 主键,int

...

Table 2:资产 Id - 主键,guid

...

Table 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");
        ...
    }
}

为了让 link table 填充,我尝试了比我愿意承认的更多的关系迭代。我如何定义这种关系?我无法更改数据库。

现在,使用上面的代码我得到以下异常:

Could not determine type for: Question.Model.NHibernate.NAsset, Question, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, for columns: NHibernate.Mapping.Column(Id)

以防万一,

  • 配对table没有有自己的ID
  • 只有两列,外键

应该引入配对对象,直接映射两端即可

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")
         ...;

在此处查看更多内容