2016-03-10 45 views
1

我正在嘗試開發CodeFluent方面以將實體的屬性設置爲全文索引。用於全文索引的CodeFluent方面

我發現這個鏈接,它做了一些類似於我的目標。 http://blog.codefluententities.com/2012/11/27/using-the-sql-server-template-producer-to-generate-clustered-indexes/

但是,這使用SQL模板生產者。無論如何設置一個屬性完全是一個全文索引本身,所以我不必爲所有項目安裝/維護模板生產者和方面?

這裏是C#方面的代碼,我到目前爲止有:

public class FullTextIndexing : IProjectTemplate 
    { 
     public static readonly XmlDocument Descriptor; 
     public const string Namespace = "http://www.softfluent.com/aspects/samples/FullTextIndexing"; 

     static FullTextIndexing() 
     { 
      Descriptor = new XmlDocument(); 
      Descriptor.LoadXml(
@"<cf:project xmlns:cf='http://www.softfluent.com/codefluent/2005/1' defaultNamespace='FullTextIndexing'> 
    <cf:pattern name='Full Text Indexing' namespaceUri='" + Namespace + @"' preferredPrefix='fti' step='Tables'> 
     <cf:message class='_doc'>CodeFluent Full Text Indexing Aspect</cf:message> 
     <cf:descriptor name='fullTextIndexing' 
      typeName='boolean' 
      category='Full Text Indexing' 
      targets='Property' 
      defaultValue='false' 
      displayName='Full-Text Index' 
      description='Determines if property should be full text indexed.' /> 
    </cf:pattern> 
</cf:project>"); 
     } 

     public Project Project { get; set; } 

     public XmlDocument Run(IDictionary context) 
     { 
      if (context == null || !context.Contains("Project")) 
      { 
       // we are probably called for meta data inspection, so we send back the descriptor xml 
       return Descriptor; 
      } 

      // the dictionary contains at least these two entries 
      Project = (Project)context["Project"]; 

      // the dictionary contains at least these two entries 
      XmlElement element = (XmlElement)context["Element"]; 
      Project project = (Project)context["Project"]; 

      foreach (Entity entity in project.Entities) 
      { 
       Console.WriteLine(">>PROPERTY LOGGING FOR ENTITY "+entity.Name.ToUpper()+":<<"); 
       foreach (Property property in entity.Properties) 
       { 
        Log(property); 
        if(MustFullTextIndex(property)) 
        { 
         Console.WriteLine("CHANGING PROPERTY"); 
         property.TypeName = "bool"; 
         Log(property); 
        } 
       } 
      } 

      // we have no specific Xml to send back, but aspect description 
      return Descriptor; 
     } 

     private static bool MustFullTextIndex(Property property) 
     { 
      return property != null && property.IsPersistent && property.GetAttributeValue("fullTextIndexing", Namespace, false); 
     } 

     private static void Log(Property property) 
     { 
      Console.WriteLine(property.Trace()); 
     } 
    } 

編輯一個:

繼Meziantou的答案,我試圖創建一個模板生產國,但它給我的編譯錯誤當我嘗試將新模板生產者添加到項目生產者列表中時,所以我可能做錯了。

錯誤說:

Cannot convert type 'CodeFluent.Model.Producer' to 'CodeFluent.Producers.SqlServer.TemplateProducer' 

這裏是我迄今爲止代碼:

public XmlDocument Run(IDictionary context) 
{ 
    if (context == null || !context.Contains("Project")) 
    { 
     // we are probably called for meta data inspection, so we send back the descriptor xml 
     return Descriptor; 
    } 

    // the dictionary contains at least these two entries 
    XmlElement element = (XmlElement)context["Element"]; 
    Project project = (Project)context["Project"]; 

    CodeFluent.Producers.SqlServer.TemplateProducer producer = new CodeFluent.Producers.SqlServer.TemplateProducer(); 
    producer.AddNamespace("CodeFluent.Model"); 
    producer.AddNamespace("CodeFluent.Model.Persistence"); 
    producer.AddNamespace("CodeFluent.Producers.SqlServer"); 

    Console.WriteLine(producer.Element); 
    //TODO: Need to figure out how to modify the actual template's contents 

    project.Producers.Add(producer); //Error happens here 


    // we have no specific Xml to send back, but aspect description 
    return Descriptor; 
} 

回答

0

在示例代碼中,方面使用,只是因爲它有一個描述符。描述符使用CodeFluent實體來填充屬性網格:當您將此屬性設置爲true或false的值

<cf:descriptor name="IsClusteredIndex" typeName="boolean" targets="Property" defaultValue="false" displayName="IsClusteredIndex" /> 

因此,XML屬性ns:IsClusteredIndex添加或從XML文件中刪除。

然後SQL模板讀取屬性的值來產生預期的SQL文件:

property.GetAttributeValue("sa:IsClusteredIndex", false) 

所以方面不是強制性的,但提供了一個圖形界面友好的方式來添加/刪除屬性。如果您不需要集成到圖形界面中,則可以安全地刪除該方面。

如果您的目標是集成到圖形界面中,您需要一個方面(XML或DLL)或生產者。如果您不想創建制作人,則可以將模板嵌入到您的方面。在構建過程中,您可以提取SQL模板並將SQL模板生成器添加到項目中,這樣一切都位於該方面。

+0

這正是我的問題。 我怎麼可能把所有通常會在模板製作中的東西都放在方面? – Oniisaki

+0

您可以使用「Project.CreateProducer」或「Project.Producers.Add」將項目添加到項目中。你想添加的生產者是'CodeFluent.Producers.SqlServer.TemplateProducer'。 – meziantou

+0

要添加一個現有的生產者實例,你可以使用'Producer.CreateProducer(project,「My producer」,producer)' – meziantou