C# 保存子对象时,Fluent NHibernate映射失败

C# 保存子对象时,Fluent NHibernate映射失败,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我试着用这个问题作为基础,但仍然有问题 我有两个类-Contact和PostalAddress-一个Contact可以有很多地址。问题是,当它以邮寄方式到达a级时,它以邮寄方式失败 此计数为1的SqlParameterCollection的索引1无效。 有一个特定联系人的地址 联系人类别 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; us

我试着用这个问题作为基础,但仍然有问题

我有两个类-Contact和PostalAddress-一个Contact可以有很多地址。问题是,当它以邮寄方式到达a级时,它以邮寄方式失败

此计数为1的SqlParameterCollection的索引1无效。

有一个特定联系人的地址

联系人类别

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;

namespace YourLivesDataEngine.DataObjects
{
    [DataContract()]
    public class Contact
    {
        private String givenName;
        private String surname;
        private String middleName;
        public Contact()
        {
            Emails              = new List<EmailAddress>();
            Addresses           = new List<PostalAddress>();
            TelephoneNumbers    = new List<TelephoneNumber>();

            givenName           = String.Empty;
            surname             = String.Empty;
            middleName          = String.Empty;

            Id                  = Guid.NewGuid().ToString();
        }
        [DataMember]
        public virtual String Id { get; set; }
        [DataMember]
        public virtual DateTime LastUpdated { get; set; }
        [DataMember]
        public virtual String Network { get; set; }
        [DataMember]
        public virtual String NetworkId { get; set; }
        [DataMember]
        public virtual String Name { get; set; }
        [DataMember]
        public virtual String GivenName { get; set; }
        [DataMember]
        public virtual String Surname { get; set; }
        [DataMember]
        public virtual String MiddleName { get; set; }
        [DataMember]
        public virtual IList<EmailAddress> Emails { get; set; }
        [DataMember(Name="Addresses")]
        public virtual IList<PostalAddress> Addresses { get; set; }
        [DataMember]
        public virtual IList<TelephoneNumber> TelephoneNumbers { get; set; }


    }
}
public class PostalAddress
{
    public PostalAddress()
    {
        Id = Guid.NewGuid().ToString();
    }
    [DataMember]
    public virtual String Id { get; set; }
    public virtual String Address { get; set; }
    public virtual String Owner { get; set; }
    public virtual String AddressType { get; set; }
    public virtual Contact Contact { get; set; }
}
还有我的映射

ContactMap

public class ContactMap : ClassMap<Contact>
{
    public ContactMap()
    {
        Table("tblContacts");
        Id(x => x.Id);
        Map(x => x.LastUpdated);
        Map(x => x.Network);
        Map(x => x.NetworkId);
        Map(x => x.Name);
        Map(x => x.GivenName);
        Map(x => x.Surname);
        Map(x => x.MiddleName);

        HasMany<PostalAddress>(x => x.Addresses)
            .Inverse()
            .KeyColumns.Add("Id", mapping => mapping.Name("Id"))
            .Cascade.SaveUpdate()
    }
}
   public class PostalAddressMap 
        : ClassMap<PostalAddress>
    {
        public PostalAddressMap()
        {
            Table("tblPostalAddresses");
            Id(x => x.Id);
            Id(x => x.Address);
            Id(x => x.AddressType);
            Id(x => x.Owner);

            References(x => x.Contact)
                .Class<Contact>()
                .Column("Owner");

        }
    }

我确信这与映射的设置方式有关,但无法看到它,而有些联系人没有地址-有些联系人没有地址,我至少应该有一些地址。

在MXI的帮助下,我现在已经修复了它

问题都出在邮递地图上。首先,我创建了所有字段的Id,因此更改了映射所需的属性

然后,每次尝试保存地址时,都会获得此SqlParameterCollection的无效索引4,计数=4错误。当字段映射两次时会导致此错误。对于此映射,映射两次的是所有者。它不需要在地图上列出——通过注释它,应用程序就可以工作了。修改后的映射类如下所示

public class PostalAddressMap 
    : ClassMap<PostalAddress>
{
    public PostalAddressMap()
    {
        Table("tblPostalAddresses");
        Id(x => x.Id);
        Map(x => x.Address);
        Map(x => x.AddressType);

        References(x => x.Contact)
            .Class<Contact>()
            .Column("Owner");

    }
}
公共类邮政地图
:ClassMap
{
公共邮政地图()
{
表(“TBLPOSTALADRESS”);
Id(x=>x.Id);
映射(x=>x.Address);
映射(x=>x.AddressType);
参考(x=>x.Contact)
.Class()
.栏(“业主”);
}
}

一旦进行了这些更改,应用程序就正确地保存了联系人和地址。

在MXI的帮助下,我们现在已经修复了它

问题都出在邮递地图上。首先,我创建了所有字段的Id,因此更改了映射所需的属性

然后,每次尝试保存地址时,都会获得此SqlParameterCollection的无效索引4,计数=4错误。当字段映射两次时会导致此错误。对于此映射,映射两次的是所有者。它不需要在地图上列出——通过注释它,应用程序就可以工作了。修改后的映射类如下所示

public class PostalAddressMap 
    : ClassMap<PostalAddress>
{
    public PostalAddressMap()
    {
        Table("tblPostalAddresses");
        Id(x => x.Id);
        Map(x => x.Address);
        Map(x => x.AddressType);

        References(x => x.Contact)
            .Class<Contact>()
            .Column("Owner");

    }
}
公共类邮政地图
:ClassMap
{
公共邮政地图()
{
表(“TBLPOSTALADRESS”);
Id(x=>x.Id);
映射(x=>x.Address);
映射(x=>x.AddressType);
参考(x=>x.Contact)
.Class()
.栏(“业主”);
}
}

一旦进行了这些更改,应用程序就会正确保存联系人和地址。

您是否通过PersistenceSpecification tester验证了地图?不要让VS靠近我,这样语法可能会关闭:不-我只是通过在PostLaddressMap中注释掉涉及所有者的行来消除问题中的错误。现在,它没有将Id写入PostalAddress记录,因此无法将Id设置为null(这是不允许的,因为它是主键),因此不允许为null。首先,您的
PostalAddressMap
是错误的,您正在将属性映射为Id。但我将如何更改以修复它?我不确定,并且只有在尝试关联两个类时才会出现这个问题。抱歉-我没有注意到我在应该使用“Map”的地方使用了Id,但现在已经改变了这一点,对于这个计数为4的SqlParameterCollection,索引4无效。这恰好是PostLaddress中映射属性的数量-现在不确定需要修复什么。-提前感谢您是否通过PersistenceSpecification tester验证了您的映射?不要让VS靠近我,这样语法可能会关闭:不-我只是通过在PostLaddressMap中注释掉涉及所有者的行来消除问题中的错误。现在,它没有将Id写入PostalAddress记录,因此无法将Id设置为null(这是不允许的,因为它是主键),因此不允许为null。首先,您的
PostalAddressMap
是错误的,您正在将属性映射为Id。但我将如何更改以修复它?我不确定,并且只有在尝试关联两个类时才会出现这个问题。抱歉-我没有注意到我在应该使用“Map”的地方使用了Id,但现在已经改变了这一点,对于这个计数为4的SqlParameterCollection,索引4无效。这恰好是PostLaddress中映射属性的数量-现在不确定需要修复什么。-提前谢谢