首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全文索引的CodeFluent方面

全文索引的CodeFluent方面
EN

Stack Overflow用户
提问于 2016-03-10 07:56:54
回答 1查看 89关注 0票数 1

我正在尝试开发一个CodeFluent方面,将实体的属性设置为全文索引。

我找到了这个链接,它做了一些类似于我的目标。http://blog.codefluententities.com/2012/11/27/using-the-sql-server-template-producer-to-generate-clustered-indexes/

但是,这使用了SQL模板生成器。是否存在将属性完全设置为方面本身的全文索引,因此我不必为所有项目安装/维护模板生成器和方面?

下面是我到目前为止拥有的C#方面代码:

代码语言:javascript
复制
    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的回答,我试图创建一个模板生成器,但是当我试图将新的模板生成器添加到项目生成器列表时,它会给我带来编译错误,所以我可能做错了。

错误说:

代码语言:javascript
复制
Cannot convert type 'CodeFluent.Model.Producer' to 'CodeFluent.Producers.SqlServer.TemplateProducer'

下面是我到目前为止所掌握的代码:

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-10 10:37:56

在示例代码中,使用方面只是因为它有一个描述符。CodeFluent实体使用描述符填充属性网格:

代码语言:javascript
复制
<cf:descriptor name="IsClusteredIndex" typeName="boolean" targets="Property" defaultValue="false" displayName="IsClusteredIndex" />

因此,当将此属性的值设置为true或false时,将从xml文件中添加或删除xml属性ns:IsClusteredIndex

然后,SQL模板读取属性值以生成预期的SQL文件:

代码语言:javascript
复制
property.GetAttributeValue("sa:IsClusteredIndex", false)

因此,这个方面不是强制性的,而是提供了一种图形界面友好的方式来添加/删除属性。如果不需要集成到图形界面中,则可以安全地删除该方面。

如果您的目标是集成到图形界面,您需要一个方面(XML或DLL)或生产者。如果您不想创建一个生成器,可以将模板嵌入到您的方面中。在构建过程中,您可以提取SQL模板并将SQL模板生成器添加到项目中,这样,所有内容都位于方面中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35910667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档