【问题标题】:Asp.Net Dynamic Data: Full Scaffolding without DbContext/ObjectContextAsp.Net 动态数据:没有 DbContext/ObjectContext 的完整脚手架
【发布时间】:2013-12-10 14:46:57
【问题描述】:

我们最近开始在我们的网站上使用动态数据模板,通过手动搭建某些“表格”、使用 EnableDynamicData extension method 并在某些 GridViews/DetailsViews 上传递我们的模型类型等。

这实际上工作得很好,并且已经在几个选定的页面上投入生产。此方法仅使用类型本身中的信息来创建一个MetaTable,其中包含用于在一堆页面上生成动态字段和过滤器的所有元数据。

我注意到这种脚手架机制非常有限,因为它没有考虑与其他类型的关系(可以理解,因为根本没有上下文信息)。

现在问题来了:例如,是否可以从一个接口生成整个 MetaModel?在我们的 Web 应用程序中,我们根本没有直接访问 DbContext。我们在另一个模块中使用 OData 协议(通过 Wcf Data Services)公开了我们的上下文,网站通过我们设计的新 DataSource 控件请求信息,以便通过 url 与 Wcf Data 进行通信。

由于我们对 DynamicData 还很陌生,所以我自己找不到这样做的方法。我尝试的第一件事是使用来自两种相关类型的信息创建我自己的MetaModel 实例,但我失败了,因为似乎没有办法手动生成它。最初,我想要的是相当于这样的东西:

gridview.EnableDynamicData(typeof(Device));
gridview.EnableDynamicData(typeof(DeviceType));

在我们的模型中,Device 和 DeviceType 之间存在一对一的关系,我需要在页面的同一个网格中显示两个模型的字段。我立即注意到第二次调用覆盖了第一次注册,因为出现了错误。然后我查看了反汇编代码以了解它的实际工作原理,很明显我根本无法使用这种方法。

此时,我深入研究了整个 MetaTable/MetaModel 类,以了解我是否可以自己创建表。通过使用MetaTable.CreateTable method,我可以轻松地从一个类型中创建单个 MetaTable,但我仍然看不到如何自己创建关系。

最优雅的方式似乎是全力以赴的脚手架机制,并在 Global.asax 上注册整个上下文。然后我意识到我需要整个 DbContext 类型(和实例)来生成 MetaModel。

这里的全部问题是责任:我根本不想将DbContext 暴露给Web 应用程序。它不会访问数据库。它所拥有的只是数据服务的 url 和它返回的模型(在共享程序集中)。同时,我需要包含关系的元数据来无缝生成 UI。

我有什么替代方法可以将这里的东西分开?理想情况下,该网站将使用完整的脚手架系统,而不依赖于 DbContext 实现和连接字符串等。我考虑创建一个接口来公开关系,有点像“假”数据上下文,但我查看的所有注册方法,如MetaModel.RegisterContext,测试传递给他们的类型,检查它是DataContext 还是ObjectContext,并尝试创建它的实例(这也使得抽象类的使用变得不可能)。

通过像这样使用完整的脚手架,我们还具有从查询字符串等自动获取默认值的优势,而无需在每个页面上编写这样的代码:

var table = MetaTable.CreateTable(typeof (Device));
var defaultValues = table.GetColumnValuesFromRoute(HttpContext.Current);
gridview.SetMetaTable(table, defaultValues);

也许甚至可以在服务器中创建 MetaModel 并通过自定义 Wcf 服务公开它?然后,我会在 Web 应用程序启动时调用此服务,以一次性注册整个事物或类似的东西。

我们目前在 web 层使用 Asp.Net 4 (.Net 4.0) WebForms 和 Entity Framework 5 Code First 进行模型映射。

【问题讨论】:

    标签: .net entity-framework webforms ef-code-first asp.net-dynamic-data


    【解决方案1】:

    不幸的是,目前我们无法解决这个问题,您必须加载完整的元模型才能获得关系。现在不确定这是否会有所帮助,但 David Ebbo 做了一个示例,看到了这个线程 here

    【讨论】:

    • 我明白了……不幸的是,这正是我所期待的。但是,他的样本的链接已损坏,还有其他方法可以获取它们吗?我很想看看他是如何在那里搭建桌子的。另外,没有办法构建一个“假”上下文类来与 web 应用程序或类似的东西共享吗?我只是不希望它访问数据库或具有任何类型的连接字符串。脚手架机制是否需要连接到数据库(我认为不需要)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    相关资源
    最近更新 更多