基本上我想使用动态数据网站来维护EF4模型中的数据,其中实体在它们自己的程序集中。模型和上下文在另一个程序集中。
我试过这个Entity Framework 4 + Self-Tracking Entities + ASP.NET Dynamic Data = Error
但是从反射中得到“模糊匹配”错误:
System.Reflection.AmbiguousMatchException未被用户代码处理
消息=找到了不明确的匹配。
来源= mscorlib程序
堆栈跟踪:
at System.RuntimeType.GetPropertyImpl(String name,BindingFlags bindingAttr,Binder binder,Type returnType,Type [] types,ParameterModifier [] modifiers)
at System.Type.GetProperty(String name)
在System.Web.DynamicData.ModelProviders.EFTableProvider..ctor(EFDataModelProvider dataModel,EntitySet entitySet,EntityType entityType,Type entityClrType,Type parentEntityClrType,Type rootEntityClrType,String name)
在System.Web.DynamicData.ModelProviders.EFDataModelProvider.CreateTableProvider(EntitySet entitySet,EntityType entityType)
在System.Web.DynamicData.ModelProviders.EFDataModelProvider..ctor(Object contextInstance,Func 1 contextFactory)
at System.Web.DynamicData.ModelProviders.SchemaCreator.CreateDataModel(Object contextInstance, Func
1 contextFactory)
在System.Web.DynamicData.MetaModel.RegisterContext(Func`1 contextFactory,ContextConfiguration配置)
在C:\ dev \ Puffin \ Puffin.Prototype.Web \ Global.asax.cs中的WebApplication1.Global.RegisterRoutes(RouteCollection路由):第42行
at WebApplication1.Global.Application_Start(Object sender,EventArgs e)在C:\ dev \ Puffin \ Puffin.Prototype.Web \ Global.asax.cs:第78行
InnerException:
答案 0 :(得分:1)
我最近遇到了类似的问题。它与我的模型中的继承有关。我有一个Resource实体,它派生了Person,Equipment等类型,在那些我已经覆盖了几个属性,但是错误地给了他们不同的签名。我将描述我的情景,希望它会有所帮助。
为了能够对框架进行足够深入的调试,并查看所有变量值,您必须禁用优化:
当你在Global.asax中注册Context时,我看到了Ambiguous Match错误:
public static void RegisterRoutes(RouteCollection routes)
{
// IMPORTANT: DATA MODEL REGISTRATION
// Uncomment this line to register an ADO.NET Entity Framework model for ASP.NET Dynamic Data.
// Set ScaffoldAllTables = true only if you are sure that you want all tables in the
// data model to support a scaffold (i.e. templates) view. To control scaffolding for
// individual tables, create a partial class for the table and apply the
// [ScaffoldTable(true)] attribute to the partial class.
// Note: Make sure that you change "YourDataContextType" to the name of the data context
// class in your application.
DefaultModel.RegisterContext(typeof(EntityModelContainer), new ContextConfiguration() { ScaffoldAllTables = true });
进入RegisterContext方法,我得到了System.Web.DynamicData.ModelProviders.EFDataModelProvider,有一段代码通过遍历EFDataModelProvider的构造函数中的继承层次结构来加载模型中的所有实体。
while(objectStack.Any()){ EntityType entityType = objectStack.Pop(); if(entityType!= null){ //当我们处于另一种根类型(没有基类型的类型)时更新实体集。 if(entityType.BaseType == null){ currentEntitySet = entitySetLookup [entityType]; }
var table = CreateTableProvider(currentEntitySet, entityType);
tables.Add(table);
}
foreach (EntityType derivedEntityType in derivedTypesLookup[entityType]) {
// Push the derived entity types on the stack
objectStack.Push(derivedEntityType);
}
}
我在这里放了一个断点,当我在我的Equipment实体(源自Resource)上调用CreateTableProvider时,我发现Ambiguous Match正在发生。
回顾原始异常的堆栈跟踪(我本来应该做的!)我在System.Web.DynamicData.ModelProviders.EFTableProvider.IsPublicProperty的构造函数中放置一个断点,并观察看哪个属性/ method /导致模糊匹配的任何东西 - 对我而言,这最终成为一个名为Resources(资源本身就是一个层次结构)的导航属性,我在设备中覆盖了它。
private static bool IsPublicProperty(Type entityClrType, string propertyName) {
var property = entityClrType.GetProperty(propertyName);
return property != null && property.GetGetMethod() != null;
}
在装备的部分课程中,我有:
public partial class Equipment
{
public new IEnumerable<Resource> Resources
{
但在父类中,Resource,Resources被定义为:
public virtual ICollection<Resource> Resources
{
当这些属性由IsPublicProperty中的.GetProperty(propertyName)加载时,它们具有相同的名称但签名不同(因为我错误地给了它们不同的返回类型)所以不清楚基于哪个shoudl加载仅在名字上。我纠正了我的错误,并使我的装备类中的资源返回ICollection,并且繁荣 - 没有更模糊的匹配。
不确定这是否有帮助,但如果你以类似的方式介入,你应该能够找到导致模糊匹配的确切原因。