使用现有的C#模型类构建实体图(.EDMX)

时间:2012-11-20 18:47:55

标签: c# oracle entity-framework visual-studio-2012 edmx

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

当前实施

该应用程序实现了Entity Framework 5(EF),但它紧密耦合:(a) EF和控制器之间没有服务层,并且< strong>(b) EF和SQL Compact之间没有IRepository样式抽象。

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

问题(Oracle)

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

预期解决方案

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

我希望它能像将C#对象拖到EDMX文件一样简单,但似乎还有更多的事情要发生。

问题

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

注意:请不要推荐付费的第三方产品。该解决方案必须适用于Visual Studio,C#,开源库或某种组合。

3 个答案:

答案 0 :(得分:1)

如果您有DbContext,您可以使用'EdmxWriter.WriteEdmx()'将您的模型编写为您应该能够与设计师一起打开的edmx文件。

答案 1 :(得分:0)

编辑:发布文章的地方重新组织了他们的网址。修正了参考。对不起,链接已损坏。

Here是我写的博客文章,解释了如何使用MetaDataTypeAttribute,在使用新生成的数据库优先/模型优先edmx时,您可以获得所有代码优先注释工作的好处。

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

答案 2 :(得分: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 Schema

通过对EDMX文件属性进行一些更改(请参阅"Model First" Step 2),您可以Generate Database from Model使用用于构建数据库模式的Oracle语法SQL脚本。

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