【问题标题】:Entity Framework 4 + Self-Tracking Entities + ASP.NET Dynamic Data = Error实体框架 4 + 自我跟踪实体 + ASP.NET 动态数据 = 错误
【发布时间】:2010-02-17 17:26:54
【问题描述】:

我正在使用 EF4 (VS2010 RC) 中的自我跟踪实体代码生成选项,并且我正在尝试使用动态数据来构建一个快速而肮脏的网站进行编辑。实体、数据上下文和 EDMX 文件都在单独的程序集中,当我在代码中调用所有内容时,此模型运行良好。但是当我尝试将它与动态数据一起使用时,我马上就失败了:

找不到“Core.Recording”的 CLR 类型。 在 System.Data.Metadata.Edm.MetadataWorkspace.GetObjectSpaceType(StructuralType edmSpaceType) 在 System.Web.DynamicData.ModelProviders.EFDataModelProvider.GetClrType(EntityType entityType) 在 System.Web.DynamicData.ModelProviders.EFDataModelProvider.CreateTableProvider(EntitySet entitySet,EntityType entityType) 在 System.Web.DynamicData.ModelProviders.EFDataModelProvider..ctor(对象 contextInstance,Func1 contextFactory) at System.Web.DynamicData.ModelProviders.SchemaCreator.CreateDataModel(Object contextInstance, Func1 contextFactory) 在 System.Web.DynamicData.MetaModel.RegisterContext(Func`1 contextFactory,ContextConfiguration 配置) 在 D:\SimpleAdmin\Global.asax.cs:line 32 中的 SimpleAdmin.Global.RegisterRoutes(RouteCollection routes) 在 D:\SimpleAdmin\Global.asax.cs:line 61 中的 SimpleAdmin.Global.Application_Start(Object sender, EventArgs e) 处

RegisterRoutes 看起来像这样:

DefaultModel.RegisterContext((() =>  new DataContext.Entities()), new ContextConfiguration() { ScaffoldAllTables = true });

Context 上的默认构造函数已修改为使用我的连接字符串,如下所示:

<add name="Entities" connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=System.Data.SqlClient;provider connection string="Data Source=xxxxxxxxxx;Initial Catalog=MyDB;Persist Security Info=True;User ID=xxxx;Password=xxxxxxx;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient"/> 

我想我没有在连接字符串中正确引用 O、C 或 CS 空格……但如果我在代码中调用上下文并使用它,它就可以正常工作。那我做错了什么?

谢谢!

【问题讨论】:

    标签: entity-framework .net-4.0 dynamic-data


    【解决方案1】:

    您需要将包含您的实体的程序集的引用添加到您的网络应用程序。

    【讨论】:

    • 你说你有,但你的堆栈说你没有。可能是其他程序集之一?
    • 您可以在 bin 文件夹中拥有所有正确的项目引用和 dll,但 ObjectContext 仍然无法在运行时找到类型,除非它已加载到其元数据中。
    【解决方案2】:

    实际上,我找到了一个可行的解决方案。源于此帖:http://thedatafarm.com/blog/data-access/wcf-data-services-and-ef-pocos-that-are-in-their-own-assembly/

    由于我只是将动态数据站点用于快速和肮脏的管理,而不是作为面向客户的生产站点,因此我不关心场景中引入的性能问题。所以我添加了一个只有 DynamicData 会使用的构造函数:

    public Entities(bool dynamicData)
        : base(ConfigurationManager.ConnectionStrings["Entities"].ConnectionString, ContainerName)
    {
        Initialize();
        var tracestring = this.CreateQuery<Address>("Entities.Addresses").ToTraceString(); 
    }
    

    然后,在 Global.asax.cs 的 RegisterRoutes 函数中,我现在有了这个:

    DefaultModel.RegisterContext((() =>  new DataContext.Entities(true)), new ContextConfiguration() { ScaffoldAllTables = true });
    

    按指示工作。有点刺激,。但是每个平台都必须有不能一起玩的模组,对吧?

    HTH。

    【讨论】:

    • 我试过了,但我在 RegisterContext 方法上得到了“模糊匹配”异常...
    【解决方案3】:

    如果您知道包含 POCO 类的程序集并拥有 ObjectContext,则可以使用以下方法将信息加载到元数据中以避免错误:

    objectContext.MetadataWorkspace.LoadFromAssembly(assemblyWithPocos);
    

    【讨论】:

      猜你喜欢
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多