当数据库模式在运行时之前未知时,是否可以使用EF 4.1及更高版本的代码优先功能

本文关键字:高版本 版本 功能 代码 EF 运行时 模式 数据库 未知 可以使 是否 | 更新日期: 2023-09-27 18:25:55

在我能找到的任何稀疏示例中,这似乎都没有明确列为功能,例如:

http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-feature-ctp5-part-1-introduction-and-model.aspx

http://www.codeproject.com/Articles/336187/code-first-practical-case

http://blogs.msdn.com/b/adonet/archive/2011/09/28/ef-4-2-code-first-walkthrough.aspx

但我认为DbContext文档至少暗示了这是可能的:http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext(v=vs.103).aspx

DbContext通常与包含模型的根实体的DbSet属性。这些当派生的实例类。

我的目标是使用EF从Silverlight客户端通过WCF数据服务访问DB,其中一些列在运行时是未知的。任何更好的想法都将不胜感激

当数据库模式在运行时之前未知时,是否可以使用EF 4.1及更高版本的代码优先功能

WCF和EF都不适合这种情况。WCF及其自动生成的代理需要编译时定义的模型-您可以避免这种情况,但结果是,您将不使用强类型数据契约,而是使用"通用数据",并且您将在XML或JSON级别上使用它们。

在EF的情况下,更糟糕的是,没有简单的解决方法来获得动态行为。您可以以动态方式更改DB甚至映射(但不是先用代码,只使用EDMX),但最终您仍然需要表示映射数据的编译类。

您所引用的文档部分不是关于映射的动态创建,而是仅关于设计时定义的映射的动态初始化。

如果有人感兴趣,这里有一个如何更改EDMX文件以匹配运行时发现的数据库的概要:

  1. 从数据库中获取并解析模式(简单XML)
  2. 将模式的格式与EDMX元数据(更复杂的XML)相比较
  3. 使用这样的工具:http://efmodeladapter.codeplex.com/对元数据进行更改(需要一些程序集)
  4. 实例化数据模型

有一种商业工具可以做同样的事情,但它不是免费的:http://huagati.com/dbmltools/

以下是其他更受欢迎的选项的最佳列表:在运行时修改实体框架模型