【发布时间】:2013-01-27 05:21:29
【问题描述】:
当我知道类型:客户和员工时,这是一个继承映射。
modelBuilder.Entity<Person>()
.Map<Customer>(c => c.Requires("Type").HasValue("Customer"))
.Map<Employee>(e => e.Requires("Type").HasValue("Employee"))
.ToTable("People", "dbo");
在我的例子中,Customer 和 Employee 类将驻留在插件程序集中。所以,我正在尝试使用反射创建映射。
注意: 为了使示例简单,我对类型进行了硬编码。另外,我只是想为 Customer 类型创建映射。
const BindingFlags binding = BindingFlags.Public | BindingFlags.Instance;
EntityTypeConfiguration<Person> entityConfig = modelBuilder.Entity<Person>();
var entityConfigType = entityConfig.GetType();
// Map Method
MethodInfo mapMethod = null;
var methods = entityConfigType.GetMethods(binding);
foreach (var method in methods)
{
if (method.Name == "Map" && method.IsGenericMethod)
{
mapMethod = method.MakeGenericMethod(typeof(Customer));
break;
}
}
// Requires Method
Type[] requiresArgType = new Type[]
{
typeof(string)
};
var mappingConfigType = typeof(EntityMappingConfiguration<Customer>);
var requiresMethod = mappingConfigType.GetMethod("Requires", binding, null, requiresArgType, null);
// Has Value Method
var vccType = typeof (ValueConditionConfiguration);
Type[] hasValueArgType = new Type[]
{
typeof(string)
};
var hasValueMethod = vccType.GetMethod("HasValue", binding, null, hasValueArgType, null);
var param1 = Expression.Parameter(typeof (EntityMappingConfiguration<Customer>), "c");
var requiresCall1 = Expression.Call(param1, requiresMethod, Expression.Constant("Type"));
var hasValueCall1 = Expression.Call(requiresCall1, hasValueMethod, Expression.Constant("Customer"));
var lambda1 = Expression.Lambda(hasValueCall1, param1);
var @delegate1 = lambda1.Compile();
mapMethod.Invoke(entityConfig, new object[]
{
@delegate1
});
当试图调用 Map 方法时,抛出以下异常:-
Object of type 'System.Func`2[System.Data.Entity.ModelConfiguration.Configuration.EntityMappingConfiguration`1[ConsoleApplication1.Customer],System.Data.Entity.ModelConfiguration.Configuration.StringColumnConfiguration]' cannot be converted to type 'System.Action`1[System.Data.Entity.ModelConfiguration.Configuration.EntityMappingConfiguration`1[ConsoleApplication1.Customer]]'.
如何转换
Func<EntityMappingConfiguration<Customer>> with return type of StringColumnConfiguration
到
Action<EntityMappingConfiguration<Customer>>
【问题讨论】:
-
Lambda 方法的通用变体成功了。
-
您好,您介意在回答您自己的问题时详细说明这一点,然后将其标记为已接受吗? (别担心,这是 StackOverflow 的常见做法)。
标签: c# linq-to-entities