[英]FluentNhibernate mapping of two tables oneToMany using unique instea of primary key in mapping
[英]FluentNHibernate Mapping with same primary key
我有2张桌子,像这样:
TABLE ARTICLE
Id int NOT_NULL PK
Title nvarchar(50) NOT_NULL
TABLE CONTENT
Id int NOT_NULL PK
content nvarchar(MAX) NOT_NULL
remarks nvarchar(200)
因此,每篇文章的内容都将具有与文章pk ID相同的pk ID,然后我就创建了这样的域类:
public class Article {
public virtual int Id {get; set;}
public virtual string Title {get; set;}
public virtual Content Content {get; set;}
}
public class Content {
public virtual int Id {get; set;}
public virtual string content {get; set;}
public virtual string remarks {get; set;}
}
我尝试像这样映射这些类:
public class ArticleMap : ClassMap<Article>
{
public ArticleMap()
{
Id(x => x.Id);
Map(x => x.Title);
Reference(x => x.Content).ForeignKey("Id");
}
}
public class ContentMap : ClassMap<Content>
{
public ContentMap()
{
Id(x => x.Id);
Map(x => x.content);
Map(x => x.remarks);
}
}
我确实将数据读取到表中,但最终出现NHibernate.ObjectNotFoundException
。 在我的情况下,我应该如何映射没有外键的类,而仅基于相同的PK Id值加入另一个表。 有人可以指导我如何使这件事起作用吗?
由于您正在寻找1:1关系,因此您的映射需要明确说明。
首先,内容需要了解其父条款。 如果您不想公开该属性,则可以使用protected internal
属性,也可以在映射中使用“ Reveal
。 请注意,在这些情况下,您将需要一个接受Article的构造函数和一个用于NHibernate的空构造函数。
public class Content {
public virtual Article { get; set; }
//other properties
}
然后,您的映射就像
public class ArticleMap : ClassMap<Article>
{
public ArticleMap()
{
Id(x => x.Id);
Map(x => x.Title);
HasOne(x => x.Content).Cascade.All();
}
public class ContentMap : ClassMap<Content>
{
public ContentMap()
{
Id(x => x.Id).GeneratedBy.Foreign("Article");
HasOne(x => x.Article).Constrained().ForeignKey();
Map(x => x.content);
Map(x => x.remarks);
}
}
另请参阅: http : //marcinobel.com/index.php/fluent-nhibernate-mapping-one-to-on-relation/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.