【问题标题】:Using existing C# model classes to build an entity diagram (.EDMX)使用现有 C# 模型类构建实体图 (.EDMX)
【发布时间】:2012-11-20 18:47:55
【问题描述】:

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

当前实现

应用程序实现了 Entity Framework 5 (EF),但它的耦合非常紧密:(a) EF 和控制器之间没有服务层,并且 (b) EF 和 SQL Compact 之间没有 IRepository 风格的抽象。

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

问题(甲骨文)

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

预期的解决方案

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

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

问题

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

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

【问题讨论】:

  • 见上面的注释 - 不能使用第三方支付的产品。

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


【解决方案1】:

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

【讨论】:

  • 这正是我想要的。诸如将bool 映射到NUMBER(1,0) 之类的问题会失败,或者EDMX 编写器如何不承认流式API 中的注释或限制(例如.HasMaxLength(50)),因此字符串变成NCLOB 而不是@ 987654325@... 但总而言之,即使它仅用于构建初始数据库模式,它也可以帮助我节省大量时间。如果您愿意,请详细说明,我会标记您的答案。再次感谢。
  • 这是因为 Oracle 不仅有与 Sql Server 不同的类型,而且它没有 EF 使用的某些类型(如 bool)。我认为您将需要重新执行 S-Side(其中大部分应该很容易在文本编辑器/VS 中替换)。 EdmxWriter 应该反映注释和流畅的配置 - 否则无法使用 CodeFirst 对不同类型的层次结构进行建模。 EdmxWriter 在内部用于构建传递给底层 ObjectContext 的 csdl/ssdl/msl 工件。因此,这些工件中未传递的内容不会反映为 ObjectContext 在这些工件上起作用。
  • 你是对的注释;我说得太早了。看起来 bool 到数字的映射是一个记录问题,我猜是模型优先表示处理的问题。但是流体映射(很像代码优先)仍然令人窒息。我要读一下那个;否则是的,我将不得不在 ViewModel 上使用 bool 并将模型与其他东西保持一致,甚至是 T/F 字符或 1/0 数字。 :( 再说一次,你就是那个男人。
  • 知道将bool 映射到NUMBER(1,0) 的任何事情吗?我与 Alex Keh 交谈并阅读了有关使用配置部分来记录 <add name="bool" value="edmmapping number(1,0)" /> 的文档,但它似乎什么也没做。
  • Alex 是 ODP.NET 背后的人之一 - 我认为您需要向他或 bing/google 询问更多详细信息。我对Oracle不是很熟悉,抱歉。
【解决方案2】:

@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 文件属性进行一些更改(请参阅 "Model First" Step 2),然后您可以将 Generate Database from Model 更改为用于构建 db 架构的 Oracle 语法 SQL 脚本。

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

【讨论】:

    【解决方案3】:

    编辑:文章发布的地方重新组织了他们的网址。修正了参考。抱歉链接失效了。

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

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

    【讨论】:

    • 没有数据库;因此“模型优先”。我需要构建一个 Oracle 可以用来构建架构的 .EDMX 文件。我正在寻找一种从现有带注释的 C# 类中设计此文件的方法。
    • 很公平。在大多数情况下,我更喜欢使用 db 工具来设计数据库,然后从中生成模型。但我对 Oracle 工具一点也不熟悉。如果您打算首先构建模型并从中生成数据库,那么在构建完所有内容后我的过程仍然可以提供帮助,但我为错过重点而道歉。我不知道如何从 POCO 代码优先类生成模型。
    • 是的,使用 EDMX 构建 Oracle 模式很容易(内置)。我想要做的是避免使用设计器来构建我已经构建的 C# 类。您会认为 EDMX 设计器足够聪明,可以让您将 C# 类放在其表面并构建底层 EDMX 数据。哦,好吧..谢谢你的尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多