3

我正在将应用程序的持久存储机制从 SQL Compact 移植到 Oracle。

当前实施

该应用程序实现了实体框架 5 (EF),但它的耦合非常紧密:(a) EF 和控制器之间没有服务层, (b)IRepository EF 和 SQL Compact 之间没有-style 抽象。

C# 模型是简单的 POCO,但具有丰富的数据注释,并使用“代码优先”样式生成 DB 模式。

问题(甲骨文)

我必须使用 Oracle 的标准 ODP.Net 提供程序。提供程序支持 EF,但不支持“代码优先”方法,仅支持“模型优先”。

预期解决方案

我试图找到一种方法来保留与控制器紧密耦合的 EF 实现以及模型类注释的丰富性,同时使用它们来构建 Oracle 可以吞下的“模型优先”样式的 EDMX 文件。本质上,我正在寻找一种模仿“代码优先”的方法。

我希望它就像将我的 C# 对象拖到 EDMX 文件上一样简单,但似乎还有很多事情要做。

问题

如何使用已经存在的 C# 模型构建 .EDMX 文件?如果不可能,实现这一目标的下一个最佳解决方案是什么?

注意:请不要推荐第三方付费产品。该解决方案必须可以使用 Visual Studio、C#开源库或某种组合来实现。

4

3 回答 3

1

如果您有 DbContext,您可以使用“EdmxWriter.WriteEdmx()”将您的模型写入您应该能够使用设计器打开的 edmx 文件。

于 2012-11-20T21:54:00.030 回答
0

编辑:文章发布的地方重新组织了他们的 URL。修正了参考。抱歉,链接断开。

是我写的一篇博客文章,它解释了如何使用 MetaDataTypeAttribute 来让您在使用新生成的数据库优先/模型优先 edmx 时受益于所有代码优先注释工作。

虽然它不允许您从模型构建 .edmx,但您至少可以从数据库生成,然后使用当前的代码优先类作为元数据。

于 2012-11-20T18:52:00.107 回答
0

@Pawel提供了基本答案,EdmxWriter. 他的回答被标记了,感谢他。我的回答只是提供更多细节、Oracle 文档参考和一个简单的代码示例:


C# 到 EDMX

命名空间为此目的提供System.Data.Entity.Infrastructure了一个静态:EdmxWriter

// 1. Instantiate your DbContext derived type
var db = new AppContext();

// 2. Instantiate an XmlWriter
var xw = XmlWriter.Create("models.edmx");

// 3. Write to file.
EdmxWriter.WriteEdmx(db, xw);

生成的 EDMX 文件可以添加到项目/解决方案中并由设计人员打开。

EDMX 到 Oracle 模式

通过对 EDMX 文件属性进行一些更改(请参阅“模型优先”步骤 2),您可以随后Generate Database from Model更改用于构建 db 模式的 Oracle 语法 SQL 脚本。

注意:正如 Pawel 在评论中指出的那样,EDMX 编写器将承认并尊重数据注释属性(例如[MaxLength])和流利的 api 配置.HasMaxLength(50),但它不处理 C#/EntityFramework 和 Oracle 的 db 类型之间的某些数据类型映射问题。

于 2012-11-21T01:17:30.630 回答