2010-11-29 62 views
0

我有一個實體由兩個不同表的屬性組成,如我所描述的here,當我嘗試插入新項目時遇到問題。插入時,我只需要更新兩個表格之一中的字段。使用ReadOnly()方法,我已經能夠讓NHibernate在保存時忽略來自[RegistrationField]的大部分字段。然而,即使該密鑰的條目已經存在,我也無法使它不嘗試爲外鍵保存[RegistrationField]的新條目。只更新一個表保存多表實體

我爲類的映射是:

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的嘗試運行以下兩個SQL語句:

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)] 

我只需要它運行第一條語句,因爲[RegistrationField]表包含一個靜態值列表,並且永遠不應該添加新項目。

歡迎任何和所有建議。

+2

等待,如果RegistrationField是一個查找表,然後`Join`是** *不***你需要什麼。你描述問題的方式讓我覺得這樣,但你應該使用一個常規的參考 – 2010-11-29 20:19:26

回答

0

好吧,在考慮了迭戈的評論並獲得了良好的夜間睡眠後,我想出了實現這一點並獲得我想要的結果的正確方法。迭戈是對的,我應該使用Reference而不是Join。我最初想要將它作爲連接實現的原因是希望避免在對象圖中添加另一個層次。 AccountRegistrationField已經是Account對象的屬性,我不想撥打電話Account.AccountRegistrationField.RegistrationField.FieldType。我反而希望電話是Account.AccountRegistrationField.FieldType,因爲我真正要操作的對象是AccountRegistrationField對象。

我能夠通過設計我的AccountRegistrationField類更好一點來獲得此行爲。我將RegistrationField屬性設置爲private,並在AccountRegistrationField類上添加公共屬性以公開我需要的字段。然後使用Fluent NHibernate的Reveal類將私有屬性公開給我的映射。

AccountRegistrationField下課這樣看:

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映射的樣子:

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"); 

    } 
} 
相關問題