不需要NHibernate的更新命令

问题描述:

我有以下类不需要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

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