在EF中实例化原始商店类型

时间:2013-10-03 07:47:28

标签: entity-framework

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

  

public abstract ReadOnlyCollection GetStoreTypes();

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

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

DbProviderManifest类通常通过派生自DbXmlEnabledProviderManifest基类来实现。它通过解析xml file

中的数据类型来实现上述方法

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

1 个答案:

答案 0 :(得分: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);