实体框架4 POCO实体在单独的装配,动态数据网站?

时间:2010-05-20 19:09:59

标签: entity-framework poco asp.net-dynamic-data

基本上我想使用动态数据网站来维护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:

1 个答案:

答案 0 :(得分:1)

我最近遇到了类似的问题。它与我的模型中的继承有关。我有一个Resource实体,它派生了Person,Equipment等类型,在那些我已经覆盖了几个属性,但是错误地给了他们不同的签名。我将描述我的情景,希望它会有所帮助。

为了能够对框架进行足够深入的调试,并查看所有变量值,您必须禁用优化:

http://blogs.msdn.com/b/kirillosenkov/archive/2009/01/27/how-to-disable-optimizations-during-debugging.aspx

当你在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,并且繁荣 - 没有更模糊的匹配。

不确定这是否有帮助,但如果你以类似的方式介入,你应该能够找到导致模糊匹配的确切原因。