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")
...;
在此处查看更多内容
我现有的数据库包含三个 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")
...;
在此处查看更多内容