我正在将应用程序的持久存储机制从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文件?如果不可能,那么实现这一目标的下一个最佳解决方案是什么?
C#
,开源库或某种组合。答案 0 :(得分:1)
如果您有DbContext,您可以使用'EdmxWriter.WriteEdmx()'将您的模型编写为您应该能够与设计师一起打开的edmx文件。
答案 1 :(得分:0)
编辑:发布文章的地方重新组织了他们的网址。修正了参考。对不起,链接已损坏。
Here是我写的博客文章,解释了如何使用MetaDataTypeAttribute,在使用新生成的数据库优先/模型优先edmx时,您可以获得所有代码优先注释工作的好处。
虽然它不允许你从模型中构建.edmx,但至少可以从数据库生成,然后使用当前的代码优先类作为元数据。
答案 2 :(得分:0)
@Pawel 提供了基本答案EdmxWriter
。他的答案很明显,谢谢他。我的答案只是提供更多细节,Oracle文档参考和一个简单的代码示例:
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文件属性进行一些更改(请参阅"Model First" Step 2),您可以Generate Database from Model
使用用于构建数据库模式的Oracle语法SQL脚本。
注意:正如Pawel在评论中指出的那样,EDMX编写者将承认并尊重数据注释属性(例如[MaxLength]
)和流畅的api配置.HasMaxLength(50)
,但它不处理C#/ EntityFramework和Oracle的数据库类型之间的某些数据类型映射问题。