2011-09-14 9 views
0

私は古いデータベースシステムに対してlinq2sqlを使用しています。このシステムには、請求書、ユーザー、およびサインアップの3つのテーブルがあります。 Invoicesテーブルには、通常、UsersテーブルのUIDキーを参照するUIDフィールドがあります。しかし、UIDフィールドがSignupUsersテーブルのUIDキーを参照する必要があることを示すIsSignupビットフィールドもあります。Linq2SQLで条件付き関係を作成

私は本当にSignupUsersテーブルとの関係は気にしませんが、linq2sqlエンティティを使用しているときに "IsSignup"値をチェックするのを忘れてしまうという問題があります。私は、エンティティのInvoices-> Users関係をIsSignupビットフィールドの条件付きにしたいと思います。

私はいくつかのアプローチを試みました。最初に私はOnLoaded設定しようとした:

public partial class Invoice 
{ 
    partial void OnLoaded() 
    { 
     if (IsSignup) 
     { 
      InvoiceUser = null; 
     } 
    } 
} 

それは我々が行うことができない請求書back--を保存するとき、それはnullに実際にUIDフィールドを設定しようとするため、これが失敗しました。

私はDataLoadOptionsを使いこなしましたが、その作業を行う方法が見つかりませんでした。

私は単にInvoiceUsersプロパティgetterを変更できましたが、dbmlが変更されるたびに上書きされます。

私はここで運が良かったですか?

答えて

0

私はここに私の解決策を入れますが、誰かが何か良いものを考え出すことを願っています。

私はLINQ to SQL templates for T4を使用してコードを生成しています。この特定の.dbmlファイルの.ttファイルに行き、関係のプロパティを生成する部分を見つけました。

<#=code.Format(association.MemberAttributes)#><#=association.Type.Name#> <#=association.Member#> 
    { 
     get { 
      <#if(association.Name == "InvoiceUser_Invoice"){#> 
          //HACK IN THE .TT FILE TO ALWAYS INCLUDE THIS CONDITIONAL RELATIONSHIP 
      if(IsSignup){return null;} 
      <#}#> 
      <#if (needsSerializationFlag && serialization) {#> 
      if (serializing && !<#=association.Storage#>.HasLoadedOrAssignedValue) { 
       return null; 
      } 
      <#}#> 
      return <#=association.Storage#>.Entity; 
     } 

これは、その特定のプロパティの生成されたコードは、必要に応じて出て​​くる可能:

[Association([email protected]"InvoiceUser_Invoice", [email protected]"_InvoiceUser", [email protected]"UID", [email protected]"UID", IsForeignKey=true)] 
    public InvoiceUser InvoiceUser 
    { 
     get { 
      //HACK IN THE .TT FILE TO ALWAYS INCLUDE THIS CONDITIONAL RELATIONSHIP 
          if(IsSignup){return null;} 
          return _InvoiceUser.Entity; 
     } 
     set { 
      InvoiceUser previousValue = _InvoiceUser.Entity; 
      if ((previousValue != value) || (!_InvoiceUser.HasLoadedOrAssignedValue)) { 
       SendPropertyChanging(); 
       if (previousValue != null) { 
        _InvoiceUser.Entity = null; 
        previousValue.Invoices.Remove(this); 
       } 
       _InvoiceUser.Entity = value; 
       if (value != null) { 
        value.Invoices.Add(this); 
        _UID = value.UID; 
       } 
       else { 
        _UID = default(int); 
       } 
       SendPropertyChanged("InvoiceUser"); 
      } 
     } 
    } 

だから私は、それは、この特定の関係に適用された場合にプロパティを変更文が「もし」にハッキング依然として不快なハックですが、少なくとも.dbmlファイルの変更により必要な条件付き関係が削除されることはありません。

関連する問題