2

私はこのような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 値に基づいて別のテーブルに参加するにはどうすればよいですか。誰かがこのことを機能させる方法を教えてもらえますか?

4

1 に答える 1

7

1 対 1 の関係を求めているため、マッピングでそれを明確にする必要があります。

まず、コンテンツはその親記事について知る必要があります。プロパティを公開したくない場合は、使用するprotected internalReveal、マッピングで使用できます。そのような場合、アーティクルを受け入れるコンストラクターと 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/

于 2013-05-23T15:09:45.660 に答える