1

每个实体框架提供程序都包含一个 DbProviderManifest 组件,该组件具有以下方法:

公共抽象 ReadOnlyCollection GetStoreTypes();

此方法用于返回所有数据库特定的数据类型。例如,MSSQL 提供程序返回 SqlServer.int、SqlServer.decimal、SqlServer.varchar... 等。

返回的集合包含 PrimitiveType 对象,这些对象存储有关数据类型的各种信息(包括命名空间和名称)。

DbProviderManifest 类通常通过派生自 DbXmlEnabledProviderManifest 基类来实现。它通过解析xml 文件中的数据类型来实现上述方法。

不幸的是,我还没有找到任何其他方法来正确实现此方法,因为 PrimitiveType 类不提供任何能够设置命名空间和数据类型名称的公共构造函数或工厂方法。是否可以通过没有xml的纯代码实现DbProviderManifest类?

4

1 回答 1

1

你总是可以使用反射。PrimitiveType 具有接受类型名称和命名空间的内部构造函数:

internal PrimitiveType(string name, string namespaceName, DataSpace dataSpace, PrimitiveType baseType, DbProviderManifest providerManifest)

通过反射,您可以获取此构造函数并通过调用它来创建 PrimitiveType:

var type = typeof(PrimitiveType);
var flags = BindingFlags.Instance | BindingFlags.NonPublic;
Binder binder = null;
var types = new Type[] { typeof(string), typeof(string), typeof(DataSpace), typeof(PrimitiveType), typeof(DbProviderManifest) };
ParameterModifier[] modifiers = null;

var constructor = type.GetConstructor(flags, binder, types, modifiers);

要创建新的 PrimitiveType,请调用此构造函数并将参数数组传递给它:

object[] parameters = { "name", "namespace", ... };
PrimitiveType result = (PrimitiveType)constructor.Invoke(parameters);
于 2013-10-03T08:03:26.140 回答