【问题标题】:Entity Framework and Default Values实体框架和默认值
【发布时间】:2017-09-14 18:27:37
【问题描述】:

在实体框架中,没有实现默认值约束功能,我自己尝试过,然后阅读了它here。所以,我想知道得到这个的最好方法是什么。我应该使用存储过程还是触发类似的东西?哪个会更好,或者在实体框架中添加了一些新的东西,因为我不想在代码中明确地处理它。 这将是一个很大的帮助。

【问题讨论】:

  • 我一直只是把默认值放在实体的初始化中。我知道这是您想要避免的,但它确实有效。
  • 在我的场景中,我的实体框架更新得更频繁,并且我有许多表,所以我通常避免对这些生成的代码文件进行任何更改。
  • 我不确定您是如何生成实体 pocos 的(根据您上面的评论,这听起来像是您首先在做数据库),但大多数工具都可以选择为您的实体创建部分类.然后,您可以创建部分类来执行实例化实体时需要执行的任何自定义逻辑。西蒙·休斯创造了一个效果很好的——marketplace.visualstudio.com/…
  • 谢谢@MikeDevenney 似乎是一个很好的建议,我很感激。但就我而言,数据库被多个应用程序使用,每个应用程序都有自己的实体框架模型,这就是为什么我正在寻找更通用的解决方案,正如我在问题的后面部分中解释的那样。

标签: c# sql sql-server entity-framework


【解决方案1】:

在 Database First 方法中,实体框架忽略默认值约束。但是实体框架显示列的默认值属性。在 Model.edmx 查看器中选择一个实体 -> 转到列 -> 属性 -> 默认值。为其中的列添加默认值即可。

就我而言,我通过代码更新了 Model.edmx 文件。代码从 Db 获取默认约束,然后更新 Model.edmx 文件中的概念模型,因为我有大量默认值列。

在 EF6 之前的所有实体框架版本中都存在默认值约束问题,并且似乎在实体框架 7 中得到解决

【讨论】:

  • 看起来你已经做了一些研究工作。竖起大拇指。
  • @Wasim,您说您“通过代码更新 Model.edmx 文件”。你是怎么做到的?
  • @Thomas,在我的情况下,数据库不够大,无法编写代码脚本,所以我手动完成了。
  • 我有一个默认约束,EF 不允许对其进行更新。任何帮助都会得到帮助。
【解决方案2】:

最简单的方法是从 C# 初始化您的属性,从而确保默认值。

对于 Database First,设计器会忽略您的 SQL 默认值,您必须告诉它将您的列视为 Computed:选择您的实体 -> 转到列 -> 属性 -> 将 StoreGeneratedPattern 设置为 Computed(默认为无)

【讨论】:

  • 只想问有没有办法为所有列设置此属性,因为当有多个表时这将是有益的。
  • @user7369792 - 检查this question
  • 我注意到的最重要的事情是,如果代码更新它,它不会保存值,只会存储默认值。还尝试了 StoreGeneratedPattern 的“Identity”选项几乎以相同的方式工作,但是它仅在插入时创建默认值,并且在此实体框架上不允许更新“Identity”列的值。
【解决方案3】:

作为一种解决方法,我认为您可以使用数据库触发器将列值更新为默认值。

【讨论】:

  • 感谢@Behzad,感谢您的建议。
  • 如果我无法从代码方面获得解决方案,我一定会选择这个选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
相关资源
最近更新 更多