2015-03-31 8 views
5

यह पूरी तरह से एक सीखने का प्रयोग है (याय विज्ञान!)। यह वास्तव में कहीं भी इस्तेमाल नहीं किया जाना है। मैं सीखना चाहता हूं कि ईएफ 6 के कमांड पेड़ इंटरसेप्टर कैसे काम करते हैं।लर्निंग एंटिटी फ्रेमवर्क 6 कमांड ट्री इंटरसेप्टर्स

मैं सभी प्रश्नों के लिए "IsActive = 1" फ़िल्टर जोड़ने के लिए अवरोधित कमांड पेड़ को संशोधित करने का प्रयास कर रहा हूं। मैंने इस तरह की चीज पर दस्तावेज़ीकरण में गंभीर कमी देखी है। दो प्रश्न:

मैं इंटरफ़ेस को कार्यान्वित करने वाली इकाइयों (जैसे IHasAnActiveProperty) चुनने के लिए कमांड पेड़ को चुनिंदा रूप से कैसे रोकूं? अभी मैं ध्यान देता हूं कि इंटरसेप्टर इतिहास संदर्भ के लिए प्रश्नों को रोक रहा है, जिसका मेरे MyEntity से कोई लेना देना नहीं है।

मैं अपने प्रश्नों को सभी प्रश्नों में कैसे जोड़ूं?

public class MyEntity 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public bool IsActive { get; set; } 
} 

public class MyDbContext : DbContext 
{ 
    public DbSet<MyEntity> Entities { get; set; } 

    public MyDbContext() : base("default") { } 


    public MyDbContext(string nameOrConnectionString) 
     : base(nameOrConnectionString) {} 
} 

public class MyConfiguration : DbConfiguration 
{ 
    public MyConfiguration() 
    { 
     AddInterceptor(new MyInterceptor()); 
    } 
} 

public class MyInterceptor : IDbCommandTreeInterceptor 
{ 
    public void TreeCreated(DbCommandTreeInterceptionContext interceptionContext) 
    { 
     var query = interceptionContext.Result as DbQueryCommandTree; 
     if (query != null) 
     { 
      Debug.WriteLine("##################"); 
      Debug.WriteLine("DataSpace: {0}", interceptionContext.Result.DataSpace); 
      Debug.WriteLine(query.ToString()); 

      query.Query.Accept(new MyVisitor()); 
     } 
    } 
} 

यह वह जगह है जहां प्रश्न का मांस निहित है। जैसा कि आप देख सकते हैं कि मैंने कुछ चीजों की पहचान की है जिन्हें शामिल करने की आवश्यकता है, लेकिन मुझे कोई संकेत नहीं है कि इन चीजों को एक साथ कैसे रखा जाए।

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var ctx = new MyDbContext()) 
     { 
      var entities = ctx.Entities.FirstOrDefault(x => x.Name == "amy"); 
      Console.WriteLine(entities); 
     } 
    } 
} 

इस आदेश पेड़ में इस क्वेरी परिणाम:

public class MyVisitor : BasicExpressionVisitor 
{ 
    public override void Visit(DbFilterExpression expression) 
    { 
     // add WHERE [IsActive] = 1 
     /* Building blocks: 
     *  DbExpressionBuilder.Equal 
     *  DbExpressionBuilder.True 
     *  DbExpressionBuilder.And --- only when a filter expression already exists 
     */ 

     var isActiveProperty = expression.Property("IsActive"); 
     var equalExp = DbExpressionBuilder.Equal(isActiveProperty, DbExpressionBuilder.True); 
    } 
} 

अगर हम इस किया था

DbQueryCommandTree 
|_Parameters 
|_Query : Collection{Record['Id'=Edm.Int32, 'Name'=Edm.String, 'IsActive'=Edm.Boolean]} 
    |_Project 
    |_Input : 'Limit1' 
    | |_Limit 
    | |_Filter 
    | | |_Input : 'Extent1' 
    | | | |_Scan : CodeFirstDatabase.MyEntity 
    | | |_Predicate 
    | | |_ 
    | |  |_'amy' 
    | |  |_= 
    | |  |_Var(Extent1).Name 
    | |_1 
    |_Projection 
     |_NewInstance : Record['Id'=Edm.Int32, 'Name'=Edm.String, 'IsActive'=Edm.Boolean] 
     |_Column : 'Id' 
     | |_Var(Limit1).Id 
     |_Column : 'Name' 
     | |_Var(Limit1).Name 
     |_Column : 'IsActive' 
      |_Var(Limit1).IsActive 

लेकिन मैं जहां यहां से जाने के लिए समझ में नहीं आता।

+1

'अभिव्यक्तिविज्ञानी' अभिव्यक्ति को संशोधित करने के लिए डिज़ाइन नहीं किया गया था, लेकिन इसके अस्तित्व को जानने के लिए और/या लॉग इन किया गया था। यदि आप कमांड को संशोधित करना चाहते हैं तो आपको 'IDbCommandInterceptor' से हटाना होगा। –

+0

@ एरिकफिलिप्स, जो बताता है * बहुत *। – Amy

+0

@ एमी तो क्या आपको कभी भी अपने कोड का वर्किंग वर्जन मिला है? मुझे इससे सीखने में दिलचस्पी होगी। – Terry

उत्तर

1

मैं मेरे एक कस्टम को लागू करने में मदद करने के लिए निम्न संदर्भ में प्रयोग किया जाता "सॉफ्ट हटाएँ" अवरोधन तंत्र:

के बारे में एक दिलचस्प बात के साथ

आशा है कि इससे

संबंधित मुद्दे