自定义 app.config 部分错误 "Unrecognized element add"

Custom app.config section error "Unrecognized element add"

我有一个小应用程序可以在我的 SQL 服务器数据库中搜索所有可以使用它的字段中的给定值。其中一部分是自定义 app.config 部分,用于保存所有这些字段。但是我在应用程序的这一行收到错误:

var section = (DatabaseFieldSection)ConfigurationManager.GetSection("DatabaseFields");

app.config:

    <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="DatabaseFields" type="PartyFinder.DataAccess.DatabaseFieldSection, DataAccess"/>
  </configSections>
  <connectionStrings>
    <!-- Data removed for security purposes -->
  </connectionStrings>
  <DatabaseFields>
    <add Key="Person.FirstName (SV)" TableName="dbo.Person" ColumnName="FirstName" FieldType="SV" />
  </DatabaseFields>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
</configuration>

类:

using System;
using System.Configuration;

namespace PartyFinder.DataAccess
{
    public class DatabaseFieldElement : ConfigurationElement
    {
        [ConfigurationProperty("Key", IsKey = true, IsRequired = true)]
        public string Key
        {
            get { return (string)base["Key"]; }
        }

        [ConfigurationProperty("TableName", IsKey = false, IsRequired = true)]
        public string TableName
        {
            get { return (string)base["TableName"]; }
        }

        [ConfigurationProperty("ColumnName", IsKey = false, IsRequired = true)]
        public string ColumnName
        {
            get { return (string)base["ColumnName"]; }
        }

        [ConfigurationProperty("FieldType", IsKey = false, IsRequired = true)]
        public string FieldType
        {
            get { return (string)base["FieldType"]; }
        }
    }

    public class DatabaseFieldSection : ConfigurationSection
    {
        [ConfigurationProperty("DatabaseFields", IsDefaultCollection = true)]
        [ConfigurationCollection(typeof(DatabaseFieldCollection), AddItemName = "add", ClearItemsName = "clear", RemoveItemName = "remove")]
        public DatabaseFieldCollection DatabaseFields
        {
            get { return ((DatabaseFieldCollection)base["DatabaseFields"]); }
        }
    }

    public class DatabaseFieldCollection : ConfigurationElementCollection
    {
        internal const string PropertyName = "Fields";

        public override ConfigurationElementCollectionType CollectionType
        {
            get
            {
                return ConfigurationElementCollectionType.AddRemoveClearMap;
            }
        }

        protected override string ElementName
        {
            get
            {
                return PropertyName;
            }
        }

        protected override bool IsElementName(string elementName)
        {
            return elementName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase);
        }

        public override bool IsReadOnly()
        {
            return false;
        }

        protected override ConfigurationElement CreateNewElement()
        {
            return new DatabaseFieldElement();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((DatabaseFieldElement)(element)).Key;
        }

        public DatabaseFieldElement this[int id]
        {
            get
            {
                return (DatabaseFieldElement)BaseGet(id);
            }
        }
    }
}

我进行了大量搜索,但到目前为止没有任何效果。非常感谢任何建议!

我通过添加父 DatabaseConfig 节点设法让以下内容在控制台应用程序中工作:

DatabaseFieldSection class:

public class DatabaseFieldSection : ConfigurationSection
{
    public static DatabaseFieldSection GetConfig()
    {
        return (DatabaseFieldSection)System.Configuration.ConfigurationManager.GetSection("DatabaseConfig") ?? new DatabaseFieldSection();
    }

    [System.Configuration.ConfigurationProperty("DatabaseFields")]
    [ConfigurationCollection(typeof(DatabaseFieldCollection), AddItemName = "add")]
    public DatabaseFieldCollection DatabaseFields
    {
        get
        {
            object o = this["DatabaseFields"];
            return o as DatabaseFieldCollection;
        }
    }
}

App.config:

<configSections>
    <section name="DatabaseConfig" type="TestEnvironment.DBConfig.DatabaseFieldSection, TestEnvironment"/>
</configSections>
<DatabaseConfig>
    <DatabaseFields>
        <add Key="Person.FirstName (SV)" TableName="dbo.Person" ColumnName="FirstName" FieldType="SV" />
    </DatabaseFields>
</DatabaseConfig>

用法:

var config = DatabaseFieldSection.GetConfig();

似乎配置 <section /> 不能与配置元素集合名称相同。例如 DatabaseFields,它需要是:

Section > Collection > Items

或者:

DatabaseConfig > DatabaseFields > add