【问题标题】:Invalid index N for this SqlParameterCollection with Count=N" server error此 SqlParameterCollection 的索引 N 无效,Count=N”服务器错误
【发布时间】:2013-12-20 21:39:27
【问题描述】:

我在这里 read many posts 关于标题中提到的异常。通常,此异常意味着我在某处将字段映射到一个实体。我花了很多时间查看我的映射,但仍然找不到问题所在。你能帮我理解这里做错了什么吗:

public class CustomerSegment : ModelEntity, IEntityDescriptor
{
    public const string Standart = "Standard";

    public virtual string Name { get; set; }
    public virtual NetworkNHMapped Network { get; set; }

    public virtual string GetDescriptor()
    {
        return Name;
    }
}

public class CustomerSegmentMap : ClassMap<CustomerSegment>
{
    public CustomerSegmentMap()
    {
        Table("NetworkProperty");
        Id(x => x.Id).Column("NetworkPropertyId");
        Map(x => x.Name).Column("PropertyName");
        References(x => x.Network).Column("NetworkId");
    }
}

}

当我尝试从数据库中获取所有 CustomerSegment 实体时发生异常。

其他实体的代码:

public class NetworkNHMapped : ModelEntity
{
    [StringLength(50)]
    public virtual string Name { get; set; }
    public virtual int NetworkOwnerId { get; set; }
    public virtual int NetworkTypeId { get; set; }

    public virtual RepairShop.NetworkType NetworkType { get { return (RepairShop.NetworkType)NetworkTypeId; } }
}

public class NetworkNewMap : ClassMap<NetworkNHMapped>
{
    public NetworkNewMap()
    {
        Table("Network");
        Id(x => x.Id, "NetworkId");
        Map(x => x.Name, "NetworkName");
        Map(x => x.NetworkOwnerId, "NetworkOwnerId");
        Map(x => x.NetworkTypeId, "NetworkType");
    }
}

基础模型实体:

public virtual int Id { get; set; }

    public override int GetHashCode()
    {
        if (!IsPersisted())
        {
            return base.GetHashCode();
        }

        unchecked
        {
            int result = GetObjectRealType(this).GetHashCode();
            result = 42 * result + Id.GetHashCode();
            return result;
        }
    }

    public override bool Equals(object other)
    {
        if (ReferenceEquals(this, other))
        {
            return true;
        }

        if ((other == null) || !(other is ModelEntity))
        {
            return false;
        }

        var thisType = GetObjectRealType(this);
        var otherType = GetObjectRealType(other);

        if (thisType != otherType)
            return false;

        if (Id.Equals(default(long)) && (other as ModelEntity).Id.Equals(default(long)))
        {
            return base.Equals(other);
        }
        return Id == (other as ModelEntity).Id;
    }

    public static bool operator ==(ModelEntity entity1, ModelEntity entity2)
    {
        var obj1 = (object)entity1;
        if (obj1 == null && ((object)entity2) == null)
            return true;

        return obj1 != null && entity1.Equals(entity2);
    }

    public static bool operator !=(ModelEntity entity1, ModelEntity entity2)
    {
        return !(entity1 == entity2);
    }

    public virtual bool IsPersisted()
    {
        return Id > 0;
    }

    protected static Type GetObjectRealType(object obj)
    {
        return (obj is INHibernateProxy) ? NHibernateUtil.GetClass(obj) : obj.GetType();
    }

}

【问题讨论】:

  • 您还可以发布 ModelEntity(是否已映射?)以及 NetworkNHMapped(及其映射)的代码

标签: c# nhibernate mapping


【解决方案1】:

我要做的第一件事是查看正在生成的 XML 文件,这会显示您是否对同一属性有重复的映射。

如果您使用的是 NH 和 ModelMapper,那么只需致电 WriteAllXmlMapping 例如:-

var mapper = new ModelMapper();
mapper.AddMappings(typeof(CmsMeta).Assembly.GetTypes());

//This will write all the XML into the bin/mappings folder
mapper.CompileMappingForEachExplicitlyAddedEntity().WriteAllXmlMapping();

如果您使用的是 Fluent NHibernate,请查看此blog post 以导出您的 XML。

在您生成 XML 之后,我敢打赌,您会发现重复的映射!否则请参阅此blog post,如果您将外键以及使用many-to-one ... 暴露给映射文件中的相关实体,则有可能。如果是这种情况,请将 insert="false" 和 update="false" 添加到外键属性并再次运行。

无论哪种方式生成 XML 并查看,如果您看不到它,请将相关的 XML 文件发布到您的问题中,我们会查看。

【讨论】:

  • 这是我的好主意,但我仍然没有发现问题。我有 52 个 xml 文件,但不知道如何找到一个有问题的文件。尽管如此,我还是有四个可疑的映射,如果你能查看它们,或者分享如何找到问题的策略,我将非常感激:dropbox.com/s/gylr07flj5ildfs/suspicious.zip
  • 看起来我在实验中发现了一个问题。我有一个映射 - 这是RepairShop 和RepairShopWeekDayProperty 表之间的一对多连接。当我只在 RepairShopWeekDayProperty 表映射中不为空时,一切正常
  • 你能添加到 GIST RepairShopWeekDayProperty.hmb.xml 吗?顺便说一句,在您暴露了外键的映射或映射中看不到任何重复。
  • 抱歉 RepairShopWeekDayProperty.hmb.xml 删除 &lt;property name="RepairShopId" 你不需要它。您始终可以使用不会命中数据库的 RepairShopTemporaryNhMapped.Id 来获取 RepairShopId,请注意我可以看到 insert="false" 和 update="false"...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多