2011-01-21 9 views
0

このフィルタコードは、私はそれをしたいどのように動作する2つのことは、それについて私を心配(現在は顧客のログインに関連するロード時間だけチケット。):流暢なNHibernate行レベルのセキュリティ実装 - あまりにもスケッチ?

  1. 列名にcollate Latin1_General_CI_ASを追加します。私はNHibernateが複数の照合に参加することをサポートしていない他の場所を読んだので、意図しない副作用が何であるか心配です。
  2. this_1_いつもは、使用されているテーブルエイリアスに頼ることができますか?

public class TimeTicketMap : ClassMap<TimeTicket> 
    { 
     public TimeTicketMap() 
     { 
      Id(x => x.TicketID).GeneratedBy.Identity(); 
      Join("CONTRACTS", x => 
            { 
           x.KeyColumn("CONTRACT collate Latin1_General_CI_AS"); 
           Id(y => y.JobNumber).Column("Job"); 
           x.Map(y => y.Customer); 
          }); 
      ApplyFilter<CustomerFilter>("this_1_.Customer = :customer"); 
     } 
    } 

流暢/ NHibernateはの専門家は、このいずれかの私を話し、または私に言っている間disapprovinglyしかめっ面することができます私はおそらく深刻な問題に実行しないのだろうか?それは列として扱われ、フィルタが存在する使用して取得しないように

答えて

0

は、私は、SQL方言への照合を追加することになった(あまり効率的で、私は、私はそれに頼ることができます知っている。)

public class CustomSqlDialect : MsSql2005Dialect 
{ 
    public CustomSqlDialect() 
    { 
     RegisterKeyword("Latin1_General_CI_AS"); 
    } 
} 

mapping.ApplyFilter<CustomerFilter> 
    (@"exists (SELECT cont.CUSTOMER FROM CONTRACTS cont 
       WHERE cont.CUSTOMER = :customer 
       AND Job COLLATE SQL_Latin1_General_CI_AS = cont.CONTRACT");