代码之家  ›  专栏  ›  技术社区  ›  tom.amourette

具有多个实体框架模型的动态数据

  •  0
  • tom.amourette  · 技术社区  · 11 年前

    我使用的是带有实体框架模型的动态数据。 如果我把它和1个EF模型一起使用,那么它就像一个魅力。

    但现在我需要在我的动态数据项目中使用多个EF模型,在注册过程中我收到了错误。

    代码:

        public static void RegisterRoutes(RouteCollection routes)
        {
            var model1 = new MetaModel();
            model1.RegisterContext(() =>
            {
                return ((IObjectContextAdapter)new Model1Entities()).ObjectContext;
            }, new ContextConfiguration() { ScaffoldAllTables = true });
    
            routes.Add(new DynamicDataRoute("model1/{table}/{action}.aspx")
            {
                Constraints = new RouteValueDictionary(new { action = "List|Details|Edit|Insert" }),
                Model = model1
            });
    
    
            var model2 = new MetaModel();
            model2.RegisterContext(() =>
            {
                return ((IObjectContextAdapter)new Model2Entities()).ObjectContext;
            }, new ContextConfiguration() { ScaffoldAllTables = true });
    
            routes.Add(new DynamicDataRoute("model2/{table}/{action}.aspx")
            {
                Constraints = new RouteValueDictionary(new { action = "List|Details|Edit|Insert" }),
                Model = model2
            });
        }
    

    在运行时,当他执行model2.RegisterContext时,我收到一个错误。

    错误:

    已添加项目。字典中的关键字: “System.Data.Objects.ObjectContext”正在添加的键: 'System.Data.Objects.ObjectContext'

    因此,对于模型1,他可以注册上下文,但对于模型2,他在这个错误上被阻止了。

    如果你知道如何解决这个问题,请给我建议!

    2 回复  |  直到 11 年前
        1
  •  0
  •   tom.amourette    11 年前

    我通过两个步骤使其发挥作用:

    • 通过删除实体模型中的“.tt”文件。
    • 在edmx模型中,将属性“代码生成策略”设置为模型的“默认”。(并重新构建解决方案)

    在此之后,他接受了多个实体的注册。

        2
  •  0
  •   StefanG    11 年前

    你好,汤姆,

    一个多月以来,我一直有同样的问题。我对此进行了多次调查,因为它阻碍了我的项目。我在这里开始了一个论坛条目:

    http://forums.asp.net/t/1946475.aspx?Duplicated+key+when+try+to+register+multiple+ObjectContexts+in+Dynamic+Data

    它在以前的版本中起作用。 有一个变通办法(请参阅 http://blog.davidebbo.com/2011/01/using-dynamic-data-with-ef-code-first.html )但这对当前版本不再有帮助。

    简而言之:这是一个ASP.Net错误。由于我们不能直接调用DbContext(这是可以区分的),并且我们必须调用ObjectContext,并且MetaModel的内部字典使用没有命名空间的类型作为键(即始终为“ObjectType”),因此无法绕过它。

    幸运的是,ASP.Net团队现在正在对此进行调查。在上述论坛页面上随时了解情况。

    2014年3月更新 :当前版本 http://blogs.msdn.com/b/webdev/archive/2014/02/28/announcing-the-release-of-dynamic-data-provider-and-entitydatasource-control-for-entity-framework-6.aspx 解决了问题。