Недавно я столкнулся с подобной проблемой. Это было связано с наследованием в моей модели. У меня была сущность Resource, у которой были получены типы Person, Equipment и т. Д., И в тех, что я переопределил пару свойств, но по ошибке дал им разные подписи. Я опишу свой сценарий, и, надеюсь, он поможет.
Чтобы иметь возможность отладить достаточно глубоко в платформе и увидеть все значения переменных, вам придется отключить оптимизацию:
http://blogs.msdn.com/b/kirillosenkov/archive/2009/01/27/how-to-disable-optimizations-during-debugging.aspx
При регистрации контекста в Global.asax вы увидели ошибку «Неоднозначное соответствие»:
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);
}
}
Я поставил точку останова здесь и смог увидеть, что неоднозначное совпадение происходит для меня при вызове CreateTableProvider для моего объекта Equipment (который был получен из Resource).
Оглядываясь на трассировку стека из исходного исключения (которое я должен был сделать в первую очередь!), Я установил точку останова в конструкторе для System.Web.DynamicData.ModelProviders.EFTableProvider.IsPublicProperty и посмотрел, какое свойство / method / независимо от того, что вызывало неоднозначное совпадение - для меня это оказалось навигационным свойством под названием Resources (ресурсы сами по себе являются иерархией), которое я переопределил в Equipment.
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
{
Когда эти свойства загружаются .GetProperty (propertyName) в IsPublicProperty, они имеют одно и то же имя, но разные подписи (потому что я дал им другой тип возвращаемого значения по ошибке), поэтому неясно, какие будут загружаться на основе на одно имя. Я исправил свою ошибку и заставил Ресурсы в своем классе Оборудования вернуть ICollection, а бум - не более неоднозначного соответствия.
Не уверен, поможет ли это или нет, но если вы пройдете подобным образом, вы сможете найти именно то, что вызывает неоднозначное совпадение.