【问题标题】:How best to handle existing database column mappings with an Entity Framework Code First model class manually?如何最好地使用 Entity Framework Code First 模型类手动处理现有数据库列映射?
【发布时间】:2012-12-20 15:15:35
【问题描述】:

我正在使用现有的 MSSQL 数据库构建一个 EF Code First 驱动的应用程序。我真的很想避免使用任何电动工具或基于向导的自动代码生成实用程序来构建我的模型和 dbcontext,因为我们需要完全控制代码生成。

我的问题是,当我构建模型时(在我的上下文中最终将作为 dbset() 属性),我应该如何处理模型中现有的 SQL 列?我是否需要为数据库中设置为“不可为空”的每个 db 列添加一个属性到我的模型类中?如果我在模型中遗漏了一些与 db 列相对应的属性,EF 会知道该怎么做吗?只是不确定这一切应该如何解决,并且在找到直接回答 CF 模型到现有数据库字段映射的资源时遇到了一些麻烦。有人有信息可以帮助澄清这个过程吗?

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 我建议使用 EF Power Tools 将现有数据库逆向工程为 POCO 类,如果只是为了学习一些关于如何自己手动编码的提示/技巧。通过对我们的一个生产数据库进行逆向工程,我能够很好地掌握如何使用 Fluent API。
  • 另外,有几种方法可以做你想做的事。我喜欢 Fluent API,因为我认为它最终变得更加干净/易于维护(您的模型和有关它的实现的细节是分开的)。许多其他人喜欢数据注释,因为它们更容易获取/使用,而且它们没有与模型分离。

标签: c# .net entity-framework ef-code-first dbcontext


【解决方案1】:

使用混合方法,从数据优先模型开始,然后使用代码优先方法添加新实体。

如果实体与其映射到的数据库实体不匹配,EF 将抛出异常。

【讨论】:

  • 感谢您的回复。所以 EF 模型类需要为每一列直接进行属性到数据库的列映射,而不管它的可为空状态如何?
  • 是的,并且可以为空的状态必须匹配,如果列不允许空值,则您的实体不能允许空值。
  • 好的,知道了。在这种情况下,最好生成一个 edmx 模型,以节省时间。数据库有很多大表,在这种情况下,为每一列编写属性需要大量时间。您会推荐 EF Datamodel edmx 还是另一种更好的方法,例如 DBContext Generator 5?
  • 肯定是 DbContext 生成器。
【解决方案2】:

这是迄今为止我与 EF 合作的唯一方法,并且没有遇到任何问题。如果对象的属性为空,EF 会将空值写入数据库。此外,您的所有列都不需要在您的实体中表示(尽管显然所有必需的列都需要存在,或者如果您想进行插入,则在数据库级别具有默认值)。我认为很难找到关于这类问题的一些信息的原因是这是 ORM 刚刚做的事情,而且做得很好。我建议尝试创建和使用您的第一个实体,看看您遇到什么问题。从现在的角度来看,这可能会比看起来容易得多。

【讨论】:

  • 太好了,谢谢。我将使用 Entity Datamodel 生成实体,然后在 CF 中工作。似乎它是 EF 针对现有数据库的安全途径。
  • 不可为空的列会引发异常。此外,在 EF 之外对 db 结构所做的任何更改都不会传播。除非数据库首先是纯代码,否则 IMO 的最佳实践是首先生成模型。
  • 我在一次性转换应用程序中映射了一个对象,我没有为不可为空的列定义属性并且能够加载对象 - 除非我在该项目的数据库设置上弄错了。如果您确定我错了,我将不得不去挖掘它并尝试弄清楚我的误解是什么......这会很好。
  • @Maess,通过从 VS 生成实体数据模型,我会打破纯 CF 方法吗?对不起,如果我的问题是菜鸟,我仍在努力解决这个问题。
  • @Maess 我刚刚在我的项目中的现有数据库表中添加了一个新的非空列,并为其提供了默认值。仍然能够加载和使用此对象,而无需对我的实体等进行任何代码更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
相关资源
最近更新 更多