【问题标题】:Nhibernate PrimaryKey must be uniqueNhibernate PrimaryKey 必须是唯一的
【发布时间】:2010-12-13 21:00:13
【问题描述】:

我在 C# 中使用本地 SQLite 数据库设置了一个 Nhibernate 项目,如果在保存我的 Nhibernate 对象时遇到问题,它说我的主键不是唯一的,没错,但我在我的 nhibernate 中添加了一个生成器-映射。

这是类:

  public class Article
      {

          public virtual int ArticleId { get; set; }
          public virtual string Name { get; set; }
          public virtual double Price { get; set; }
          public virtual string ArticleNumber { get; set; }
          public virtual string Description { get; set; }

          public virtual Sales Sales {get; set;}
     }

这是映射文件:

<class name="Article">
    <id name="ArticleId">
      <generator class="identity" />
    </id>
    <property name="Name" />
    <property name="Price" />
    <property name="ArticleNumber" />
    <property name="Description" />

    <many-to-one name="Sales" class="Sales" column="SalesId"/>

</class>

我正在创建一些文章,并将其添加到销售中,如果我想保存我的销售,它得到了这个 PrimaryKey 异常。

是否存在已知问题?

非常感谢,亚历克斯

销售映射:

<class name="Sales">
    <id name="SaleId" unsaved-value="0">
      <generator class="identity" />
    </id>
    <property name="Amount" />
    <property name="Price" />

    <bag name="OrderList" cascade="all">
      <key column="ArticleId"/>
      <one-to-many class="Article"/>
    </bag>

  </class>

public class Sales
    {
        public Sales()
        {
            if (this.orderList == null)
                orderList = new List<Article>();
        }

        private IList<Article> orderList;

        public virtual int SaleId { get; set; }
        public virtual double Price { get; set; }
        public virtual int Amount { get; set; }

        public virtual IList<Article> OrderList 
        {
            get
            {
                return this.orderList;
            }
            set
            {

                this.orderList = value;
            }
        }
   }

【问题讨论】:

  • 您的数据库架构是如何生成的? PK 是否创建为标识列?
  • Nhibernate 正在创建数据库模式(:我没有连接到现有数据库。

标签: c# nhibernate hibernate primary-key


【解决方案1】:

我建议这样设置您的身份映射:

<id name="ArticleId" unsaved-value="0">
  <generator class="native" />
</id>

确保 PK 字段是一个身份字段。

然后在您的销售映射中:

<many-to-one name="Sales" class="Sales" column="SalesId" insert="true" update="true"/>

您的销售映射也是如此。确保它的 id 映射有一个未保存的值 0 并且 PK 被标记为一个身份字段。

【讨论】:

  • 我应该在另一边实施相同的更改吗?
  • 是的。如果可以,请发布您的销售映射文件。
  • 我已将销售映射添加到帖子中,unsaved-value="0" 属性是新的
  • 哦,我已经修复了一个小错误, 映射的列标识是 SaleId,但它没有修复其他问题
  • 包“OrderList”应设置为 Inverse="False"。我认为发生的事情是销售实体正在保存文章,然后尝试保存销售对象。
【解决方案2】:

问题是我使用的是事务,没有事务它工作得很好。

感谢 Jeffrey Jochum 的帮助。

【讨论】:

    猜你喜欢
    • 2017-09-20
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2018-07-26
    • 1970-01-01
    相关资源
    最近更新 更多