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

时间:2017-09-22 13:14:39

标签: c# nhibernate fluent-nhibernate

我有一个现有的数据库,它有三个表,两个实体表和一个链接表。两个实体表中的每一个都具有主键id。一个使用int,一个使用guid。连接表包含两列,即每个表的主键。所以,粗略看起来像这样:

表1:问题 Id - 主键,int

...

表2:资产 Id - 主键,guid

...

表3:QuestionAsset

资产 - (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");
        ...
    }
}

我尝试了更多的关系迭代,而不是承认让链接表填充。我该如何定义这种关系?我无法更改数据库。

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

  

无法确定类型:Question.Model.NHibernate.NAsset,Question,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null,对于列:NHibernate.Mapping.Column(Id)

1 个答案:

答案 0 :(得分:0)

如果是,

  • 配对表有自己的 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")
         ...;

在此处查看更多信息