自定义 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
我有一个小应用程序可以在我的 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