2010-11-29 7 views
0

hereと記載されている2つの異なるテーブルのプロパティで構成されるエンティティがあり、新しいアイテムを挿入しようとすると問題が発生します。挿入するときは、2つのテーブルのうちの1つのフィールドのみを更新する必要があります。 ReadOnly()メソッドを使って、私は保存時に[RegistrationField]のフィールドのほとんどを無視するようにNHibernateを得ることができました。しかし、そのキーのエントリがすでに存在していても、外部キーの新しいエントリを[RegistrationField]に保存しないようにすることはできません。マルチテーブルエンティティの保存時に1つのテーブルのみを更新する

クラスのための私のマッピングは次のとおりです。

INSERT INTO AccountRegistrationField (
    AccountID, 
    DefaultValue, 
    FieldID, 
    IsRequired, 
    Label, 
    Priority) 
VALUES (@p0, @p1, @p2, @p3, @p4, @p5); 
select SCOPE_IDENTITY(); 
@p0 = 1 [Type: Int32 (0)], 
@p1 = 'bar' [Type: String (4000)], 
@p2 = 1 [Type: Int32 (0)], 
@p3 = False [Type: Boolean (0)], 
@p4 = 'bar' [Type: String (4000)], 
@p5 = 1 [Type: Int32 (0)] 

INSERT INTO RegistrationField (UserRegistrationField_id) VALUES (@p0); 
@p0 = 12 [Type: Int32 (0)] 

私はそれを必要とする:

public class RegistrationFieldMap : ClassMap<RegistrationField> 
{ 
    public RegistrationFieldMap() 
    { 
     Table("AccountRegistrationField"); 

     Id(r => r.ID).Column("RegistrationID"); 
     Map(r => r.AccountID); 
     Map(r => r.DefaultValue); 
     Map(r => r.FieldID); 
     Map(r => r.IsRequired); 
     Map(r => r.Label); 
     Map(r => r.Priority); 
     Join("RegistrationField", t => 
     { 
      t.Map(r => r.FieldType).ReadOnly(); 
      t.Map(r => r.HtmlID).ReadOnly(); 
     }); 
    } 
} 

私はマッピングを確認するために私のテストを実行して、NHibernateのは以下の2つのSQL文を実行しようとします[RegistrationField]テーブルには値の静的リストが含まれており、新しい項目を絶対に追加しないでください。最初のステートメントを実行します。

任意のすべての提案を歓迎します。

+2

待ち、その後、 'Join'がある:

public class AccountRegistrationField { public virtual int ID { get; set; } public virtual int AccountID { get; set; } public virtual string DefaultValue { get; set; } public virtual int FieldID { get; set; } public virtual string HtmlID { get { return RegistrationField.HtmlID; } } public virtual bool IsRequired { get; set; } public virtual string Label { get; set; } public virtual int Priority { get; set; } public virtual string FieldType { get { return RegistrationField.FieldType; } } private RegistrationField RegistrationField { get; set; } } 

そしてAccountRegistrationFieldのための私のマッピングは次のようになります。

AccountRegistrationFieldクラスは、このように見てしまいましたあなたが必要とするものではありません。あなたが問題を説明したやり方で私はそう思っていましたが、あなたはおそらく定期的なリファレンスを使用しているはずです –

+0

私はこの1つについてDiegoに同意しなければなりません。 – Phill

答えて

0

ディエゴのコメントを考えて、良い夜の睡眠を取った後、私はこれを実装し、私が望む結果を得る正しい方法を考え出しました。私がReferenceを使用し、Joinを使用してはならないことがディエゴです。これを結合として実装したいという私の元々の推論は、オブジェクトグラフに別のレベルを追加したくないという希望でした。 AccountRegistrationFieldは既にAccountオブジェクトのプロパティであり、Account.AccountRegistrationField.RegistrationField.FieldTypeのような呼び出しを行う必要はありませんでした。私が実際に操作しているオブジェクトはAccountRegistrationFieldオブジェクトなので、私は代わりにAccount.AccountRegistrationField.FieldTypeであることを望んでいました。

私のAccountRegistrationFieldクラスを少し上手に設計することで、この動作を得ることができました。 RegistrationFieldプロパティをプライベートにし、AccountRegistrationFieldクラスのパブリックプロパティを追加して、必要なフィールドを公開しました。そしてFluent NHibernateのRevealクラスを使用して、プライベートプロパティをマッピングに公開しました。 ** RegistrationFieldは、ルックアップテーブルである場合、

public class AccountRegistrationFieldMap : ClassMap<AccountRegistrationField> 
{ 
    public AccountRegistrationFieldMap() 
    { 
     Table("AccountRegistrationField"); 

     Id(r => r.ID).Column("RegistrationID"); 
     Map(r => r.AccountID); 
     Map(r => r.DefaultValue); 
     Map(r => r.IsRequired); 
     Map(r => r.Label); 
     Map(r => r.Priority); 
     References<RegistrationField>(
       Reveal.Member<AccountRegistrationField>("RegistrationField")) 
      .Column("FieldID"); 

    } 
} 
関連する問題