2010-11-09 125 views
1

我有以下類不需要NHibernate的更新命令

public class Contact 
{ 
    public Contact() { 
     Addresses = new List<Address>(); 
     EmailAddresses = new List<EmailAddress>(); 
     PhoneNumbers = new List<PhoneNumber>(); 
    } 
    public virtual int ContactID { get; private set; } 
    public virtual Firm Firm { get; set; } 
    public virtual ContactType ContactType { get; set; } 
    public virtual string FullName { get; set; } 
    public virtual string FiscalCode { get; set; } 
    public virtual string Notes { get; set; } 
    public virtual ContactRole ContactRole { get; set; } 

    public virtual IList<Address> Addresses { get; private set; } 
    public virtual IList<EmailAddress> EmailAddresses { get; private set; } 
    public virtual IList<PhoneNumber> PhoneNumbers { get; private set; } 
} 

public class Address 
{ 
    public virtual int AddressID { get; private set; } 
    public virtual string StreetAddress { get; set; } 
    public virtual string ZipCode { get; set; } 
    public virtual string City { get; set; } 
    public virtual Province Province { get; set; } 
    public virtual Country Country { get; set; } 
    public virtual Contact Contact { get; set; } 
    public virtual AddressType AddressType { get; set; } 
    public virtual bool PostalAddress { get; set; } 
} 

這些類一直在使用FluentNHibernate映射到數據庫。這些是映射類

public ContactMap() { 
    Table("Contacts"); 
    Id(c => c.ContactID).Column("ContactID").GeneratedBy.Identity(); 
    References(c => c.Firm).Column("FirmID"); 
    References(c => c.ContactType).Column("ContactTypeID"); 
    Map(c => c.FullName); 
    Map(c => c.FiscalCode); 
    Map(c => c.Notes); 
    References(c => c.ContactRole).Column("ContactRoleID"); 
    HasMany(c => c.Addresses).Cascade.SaveUpdate(); 
    HasMany(c => c.EmailAddresses).Cascade.SaveUpdate(); 
    HasMany(c => c.PhoneNumbers).Cascade.SaveUpdate(); 
} 


public AddressMap() { 
    Table("Addresses"); 
    Id(a => a.AddressID).Column("AddressID").GeneratedBy.Identity(); 
    Map(a => a.StreetAddress); 
    Map(a => a.ZipCode); 
    Map(a => a.City); 
    References(a => a.Province).Column("ProvinceID"); 
    References(a => a.Country).Column("CountryID"); 
    References(a => a.Contact).Column("ContactID"); 
    References(a => a.AddressType).Column("AddressTypeID"); 
    Map(a => a.PostalAddress); 
} 

我想加載數據庫內使用這些類的相當數量的聯繫人。我的代碼創建這些對象可以是邏輯上解釋遵循

Create a contact 
For each address of this contact 
    create an address 
    set the contact address 
    add the address to the contact collection 
Next 
For each email of this contact 
    create an email 
    set the contact email 
    add the email to the contact collection 
Next 

我沒有問題,所有的後代收藏,如電子郵件,******中國不同的是我有解決問題。事實上,當我嘗試插入至少有一個地址,我收到以下錯誤

Could not insert collection: [GSLConverter.Entities.Contact.Addresses#3551][SQL: UPDATE Addresses SET AuthorID = @p0 WHERE AddressID = @p1] 
Invalid column name 'AuthorID' 

而不是使用的ContactID使用的AuthorID的接觸。 AuthorID來自哪裏????

這些是NHibernate的服務器

INSERT INTO Addresses (StreetAddress, ZipCode, City, PostalAddress, ProvinceID, CountryID, ContactID, AddressTypeID) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7); 
select SCOPE_IDENTITY(); 
@p0 = 'xxx xxxxxx, 69 ', @p1 = '80142', @p2 = 'xxxxxx', @p3 = False, @p4 = 1, @p5 = 113, @p6 = 3632, @p7 = 1 

UPDATE Addresses SET AuthorID = @p0 WHERE AddressID = @p1; 
@p0 = 3632, @p1 = 26 

@Stefan Steinegger上執行查詢:這是類的映射,只有一個,那引用的AuthorID構件

public IssueNoteMap() { 
    Table("IssueNotes"); 
    Id(ino => ino.IssueNoteID).Column("IssueNoteID").GeneratedBy.Identity(); 
    References(ino => ino.Issue).Column("IssueID"); 
    Map(ino => ino.NoteDate); 
    Map(ino => ino.NoteTitle); 
    Map(ino => ino.NoteBody); 
    References(ino => ino.Author).Column("AuthorID"); 
} 

AuthorID字段是對聯繫人表的引用,它尚未映射到聯繫人一側(如您從前一個聯繫人映射中看到的那樣)

+0

有沒有可能是你有一些約定的其他地方可能被幹擾?聽起來很荒謬,但是你有一個引用Address的Author對象嗎?如果有的話,可能會由於綁定而觸發意外事件。 – ddango 2010-11-09 21:12:51

+0

你好,謝謝你的回覆。我沒有任何約定expressely設置。我已經在我的課程上找到了一些信息,實際上我發現一個類中的AuthorID字段與任何地址和聯繫都沒有關係。有沒有辦法查看FluentNHibernate在這些類上所做的映射? – Lorenzo 2010-11-09 21:18:48

+0

這個與AuthorId的映射看起來如何? – 2010-11-09 21:31:21

回答

5

IssueNote.Author任何一種類型的Contact?如果是這樣的

References(ino => ino.Author).Column("AuthorID"); 

Fluent Mapping嘗試更新您的「地址」表,以確保它也有存儲在AuthorId外鍵,你告訴它ContactIdIssueNote.Author使用時映射Contact小號

你告訴NHibernate的這個:

alt text

當你真的想這樣: alt text

所以,IssueNoteMap更改爲以下,以便使用ContactID用於映射的作者,它應該工作

References(ino => ino.Author).Column("ContactId"); 
+0

哇!你絕對正確!我剛剛開始使用NHibernate,因爲在閱讀手冊時我太懶惰了,我認爲'References'映射會引用本地側欄。我已經應用了您的建議,並且一切正常。非常感謝你。還有一個問題:你是如何製作這些圖表的?我的意思是,你使用了哪個工具?再次感謝 – Lorenzo 2010-11-09 23:34:45

+1

不用擔心:)圖表來自優秀網站http://yuml.me/ – ChrisAnnODell 2010-11-09 23:35:46