1

いくつかのデフォルト値を設定する必要があり、それぞれ次のクラスとマッピングがあります。

Farmacia.cs

public class Farmacia
{
    public virtual int Id { get; protected set; }
    public virtual string Nombre { get; set; }
    public virtual string Direccion { get; set; }
    public virtual string Telefono { get; set; }
    public virtual int CodigoPostal { get; set; }
    public virtual int Estado { get; set; }

    public Farmacia()
    {
    }
}

Farmacia.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                  assembly="Domain"
                  namespace="Domain">
  <class name="Farmacia" table="farmacias">
    <id name="Id" column="idFarmacia" type="int">
      <generator class="assigned" />
    </id>
    <property name="Nombre" />
    <property name="Direccion" />
    <property name="CodigoPostal">
      <column name="codPostal" default="1"/>
    </property>
    <property name="Telefono" />
    <property name ="Estado">
      <column name="estado" default="1" />
    </property>
  </class>
</hibernate-mapping>

テスト

Domain.Farmacia f = new Domain.Farmacia { Nombre = "Test" };
Session.Save(f);
Session.Flush();

そして、データベースに挿入できないという例外が発生します。

一方、コードにいくつかの変更を加えた場合 (以下を参照)、それを保存できます。

public class Farmacia
{
    public virtual int Id { get; protected set; }
    public virtual string Nombre { get; set; }
    public virtual string Direccion { get; set; }
    public virtual string Telefono { get; set; }
    public virtual int CodigoPostal { get; set; }
    public virtual int Estado { get; set; }

    public Farmacia()
    {
        Estado = 1;          // New line.
        CodigoPosta = 1;     // New line.
    }
}

Farmacia.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                  assembly="Domain"
                  namespace="Domain">
  <class name="Farmacia" table="farmacias">
    <id name="Id" column="idFarmacia" type="int">
      <generator class="assigned" />
    </id>
    <property name="Nombre" />
    <property name="Direccion" />
    <property name="CodigoPostal" column="codPostal" />   // Property changed.
    <property name="Telefono" />
    <property name ="Estado" />                           // Property changed.
  </class>
</hibernate-mapping>

私の問題は、オブジェクトが新しい場合にのみデフォルト値が必要なことです。オブジェクトが既にデータベース上にある場合、データベースからのオブジェクトは常に と にいくつかの値をEstado持ちCodigoPostalます。

PD: データベースにデフォルト値を割り当てましたが、エラーが続きます。では、値が null (オブジェクトが新しい) の場合、どのようにデフォルト値を設定できますか?

4

1 に答える 1

1

コンストラクターにデフォルト値を入れることによって上記で行ったことは私には問題ないように思えますが、別の方法を探している場合は、次のようなものを使用できるかもしれません:

(7) dynamic-update (オプション、デフォルトは false): UPDATE SQL が実行時に生成され、値が変更された列のみが含まれるように指定します。

(8) dynamic-insert (オプション、デフォルトは false): INSERT SQL が実行時に生成され、値が null でない列のみが含まれるように指定します。

上記はここから取られました: http://www.nhforge.org/doc/nh/en/index.html#mapping-declaration-class

整数列に対してデータベースのデフォルトを使用できる唯一の方法はdynamic-insert、整数のデフォルト値が0であるため、それらをnull可能にして使用することです。

public class Farmacia
{
    public virtual int Id { get; protected set; }
    public virtual string Nombre { get; set; }
    public virtual string Direccion { get; set; }
    public virtual string Telefono { get; set; }
    public virtual int? CodigoPostal { get; set; }
    public virtual int? Estado { get; set; }

    public Farmacia()
    {

    }
}
于 2013-01-24T13:34:57.833 に答える