【问题标题】:Fluent NHibernate Mapping helpFluent NHibernate 映射帮助
【发布时间】:2011-05-27 08:59:01
【问题描述】:

我收到以下错误:

此 OracleParameterCollection 的索引 3 无效,Count=3

当我尝试向表中插入新列时。

我的实体类是:

public class Operator
{
    public Operator()
    {
        this.OperatorMemberships = new List<OperatorMembership>();
    }
    public virtual int Id { get; set; }
    public virtual int OperatorMembershipId { get; set; }
    public virtual int SchemeId { get; set; }
    public virtual string Description { get; set; }
    public virtual IList<OperatorMembership> OperatorMemberships { get; set; }
}

public class OperatorMembership
{
    public virtual int Id { get; set; }
    public virtual int OperatorId { get; set; } // delete
    public virtual int UserRoleId { get; set; } // delete
    public virtual UserRole UserRole { get; set; }
    public virtual Operator Operator { get; set; }
}

我的映射是:

public OperatorMap()
    {
        Table("OPERATOR");
        Id(x => x.Id, "OPERATOR_ID").GeneratedBy.Identity();
        Map(x => x.SchemeId, "SCHEME_ID");
        Map(x => x.Description, "DESCRIPTION");
        //HasMany(x => x.OperatorMemberships).Inverse().AsBag().Cascade.AllDeleteOrphan();
        HasMany(x => x.OperatorMemberships).Inverse().AsBag();
        //References(x => x.SchemeServices, "OPERATOR_ID");
    }
}

public class OperatorMembershipMap : ClassMap<OperatorMembership>
{
    public OperatorMembershipMap()
    {
        Table("USER_OPERATOR_MEMBERSHIP");
        Id(x => x.Id, "USER_OPERATOR_MEMBERSHIP_ID").GeneratedBy.Identity();
        Map(x => x.OperatorId, "OPERATOR_ID");
        Map(x => x.UserRoleId, "USER_ROLE_ID");

        References(x => x.Operator).Column("OPERATOR_ID"); ;
        References(x => x.UserRole).Column("USER_ROLE_ID");
    }
}

插入新行的代码是:

public int AddOperatorMembership(int operatorId, int userRoleId)
    {
        OperatorMembership op = new OperatorMembership();
        op.OperatorId = operatorId;
        op.UserRoleId = userRoleId;
        _provider.AddEntity(op);

        return op.Id;
    }

我的数据库表是:

USER_OPERATOR_MEMBERSHIP_ID -- OPERATOR_ID -- USER_ROLE_ID

任何帮助都会很好,我相信那里有一些非常聪明的流利的 nhibernate 开发人员可以立即发现错误。

非常感谢。

兰道夫。

【问题讨论】:

    标签: fluent-nhibernate nhibernate-mapping fluent


    【解决方案1】:

    您正在映射引用的实体和外键:

    public OperatorMembershipMap()
    {
        Table("USER_OPERATOR_MEMBERSHIP");
        Id(x => x.Id, "USER_OPERATOR_MEMBERSHIP_ID").GeneratedBy.Identity();
        // Map(x => x.OperatorId, "OPERATOR_ID");
        // Map(x => x.UserRoleId, "USER_ROLE_ID");
    
        References(x => x.Operator).Column("OPERATOR_ID"); ;
        References(x => x.UserRole).Column("USER_ROLE_ID");
    }
    

    您还可以从您的实体中删除外键:

    public class OperatorMembership
    {
        public virtual int Id { get; set; }
        // public virtual int OperatorId { get; set; } // delete
        // public virtual int UserRoleId { get; set; } // delete
        public virtual UserRole UserRole { get; set; }
        public virtual Operator Operator { get; set; }
    }
    

    【讨论】:

    • 如果我删除了这些属性,那么我无法使用我的代码访问它们以使用这些值进行更新:op.OperatorId = operatorId; op.UserRoleId = userRoleId;
    • 你可以使用 op.Operator = session.Load(operatorId)
    • 嗨,mathieu,我将如何保存新的操作员会员行?如果我没有这 2 个属性,那么我将无法保存,operatormembership 表是 operator 和 userrole 的查找表。
    • Cheers Mate,你说得对,我只是不需要映射列,但仍然将它们留在类实体中并且它有效。
    【解决方案2】:

    我也遇到了同样的问题,结果谷歌搜索了半天,但没有成功。 Mathieu 给出的上述答案似乎很相关,我尝试了同样的方法,但对我不起作用。然后我尝试删除引用并保持属性不变,它对我有用,希望对你也有用。

        Table("USER_OPERATOR_MEMBERSHIP");
        Id(x => x.Id, "USER_OPERATOR_MEMBERSHIP_ID").GeneratedBy.Identity();
        Map(x => x.OperatorId, "OPERATOR_ID");
        Map(x => x.UserRoleId, "USER_ROLE_ID");
    
        //References(x => x.Operator).Column("OPERATOR_ID"); ;
        //References(x => x.UserRole).Column("USER_ROLE_ID");
    

    也从类中删除相同的内容

    public class OperatorMembership
    {
         public virtual int Id { get; set; }
         public virtual int OperatorId { get; set; } // delete
         public virtual int UserRoleId { get; set; } // delete
         //public virtual UserRole UserRole { get; set; }
         //public virtual Operator Operator { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-02
      • 2011-04-10
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 2011-06-18
      • 2012-04-03
      • 2012-10-19
      相关资源
      最近更新 更多