2016-07-13 6 views
0

私のモデルでは、エンティティキーの型としてbigint(ulong)を使用しています。私はデータベースに参照整合性を強制したいので、persistenceEnforceをtrueに設定しました。外部キーの列はNULL可能です。参照整合性では、外部キーがそのエンティティを参照していない場合にのみエンティティを削除することができるので、エンティティを削除する前に、この関連エンティティの各外部キーを最初にnullに設定する必要があります。しかし、私は外部キーをクリアする方法を知らない。ここでエンティティ・キーのタイプがbigint(ulong)の場合、外部キーをnullに設定する方法はありますか。

は私のモデルである:ここでは

<cf:entity name="Order" cfom:bindingList="false"> 
    <cf:property name="Id" typeName="ulong" key="true" persistenceIdentity="true" cfps:hint="CLUSTERED" /> 
    <cf:property name="Invoice" typeName="Invoice" persistenceEnforce="true" /> 
</cf:entity> 

<cf:entity name="Invoice" cfom:bindingList="false"> 
    <cf:property name="Id" typeName="ulong" key="true" persistenceIdentity="true" cfps:hint="CLUSTERED" />  
    <cf:property name="Name" typeName="string" /> 
</cf:entity> 

は私のコードです:

Invoice invoice = new Invoice(); 
invoice.Save(); 

Order order = new Order(); 
order.Invoice = invoice; 
order.Save(); 

// We must clear the reference to the invoice before deleting the invoice, 
// because the database enforces referential integrity. 
order.InvoiceId = 0; 
order.Save(); 

invoice.Delete(); 

二度目の注文を保存するときに上記のコードは次の例外がスローされます。 と競合UPDATEステートメントFOREIGN KEY制約\ "FK_Ord_Ore_Inv_Inv \"です。

これは、CodeFluentによって生成されたコードがnullの代わりに値0を「Order_Invoice_Id」列に挿入するためです。 Order.BaseSaveメソッドの次の行は間違っているようです: persistence.AddParameter( "@ Order_Invoice_Id"、this.InvoiceId、((ulong)(0ul)));

私はインボイスのプロパティでpersistenceDefaultValue = "null"とusePersistenceDefaultValue = "true"の設定を試しましたが、問題は解決しませんでした。

答えて

0

注:タイプUInt64(符号なし)のプロパティは、bigint(符号付き)の列に変換されます。したがって、変換に注意してください。FYI CodeFluent Entitiesでは、値の変換にCodeFluent.Runtime.Utilities.ConvertUtilitiesを使用しています。

オーバーロードAddParameter(string name, ulong value, ulong defaultValue)はデフォルト値を使用しないため、デフォルト値をNULLに変換しません。回避策として、あなたが予想される動作と一致するようにパラメータの値を変更PersistenceHookを作成することができます。

public class CustomPersistenceHook : BasePersistenceHook 
{ 
    public override void AfterAddParameter(string name, object value, IDbDataParameter parameter) 
    { 
     if (value is ulong && name == "@Order_Invoice_Id") 
     { 
      var defaultValue = (ulong)ContextData["defaultValue"]; 
      if (defaultValue == (ulong)value) 
      { 
       parameter.Value = DBNull.Value; 
      } 
     } 

     base.AfterAddParameter(name, value, parameter); 
    } 
} 

その後、あなたは永続フックを登録する必要があります。

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="Sample" type="CodeFluent.Runtime.CodeFluentConfigurationSectionHandler, CodeFluent.Runtime" /> 
    </configSections> 

    <Sample persistenceHookTypeName="Sample.CustomPersistenceHook, Sample" /> 
</configuration> 
関連する問題