1

我有2个表所示:FluentNHibernate映射与相同的主键

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

你为什么做这样的说法,而不必从文章内容外键? –

+0

您没有指定FK,所以您尝试使用'Column(“Id”)'而不是'ForeignKey(“Id”)'?这只是一个猜测虽然... –

+0

@ColmPrunty我只是迁移它使用ORM,它是遗留表,所以我不想改变它 –

回答

5

表和关键既然你正在寻找一个1:1的关系,你的映射需要说清楚。

首先,内容需要知道其父文章。如果您不希望公开该财产,则可以使用protected internal或在映射中使用Reveal。请注意,在这些情况下,您需要一个接受文章的构造函数和一个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/

+0

谢谢,它的工作原理,但我插入时出现问题:'试图分配ID从null一对一属性:文章' –

+1

我已经想通了,我需要分配'Content.Article = newArticle;' –

0

尝试指定在映射

References(x => x.Content).Table("Content").KeyColumn("Id"); 
+0

在'参考文献()' –

+0

哎呀,我在看HasMany() –

+1

尝试'参考(x => x.Content).Column(“Id”)。NotFound.Ignore();'是否有任何没有内容的文章或反之亦然? –