2

我创建了一个名为“项目”的实体。它有一个 Id、CreateDate 和 ModifyDate 以及一些必需的数据。

我正在使用 EF 4.3 Code First 模型。如果它解决了我的问题,我可以使用最新版本的 EF。

所有这三个值都是可选的。有时,我可能会传递一些值,比如 Id 或 CreateDate。如果我不通过,我希望 EF 从 DB 自动生成这些值,否则取我通过的值。

到目前为止,我发现,如果我将 Id 列设置为 Identity 列,那么它会忽略提供的值,计算列也是如此。

无论如何我可以选择提供这些价值吗?

还有一件事,我修改了日期字段。每当我更新记录时,我希望数据库更新当前日期时间。我找到了以下选项,但不知何故,我对其中任何一个都不满意。DB是否有任何直接选项(类似于默认值)?

  1. 使用 Update 触发器更新 modifydate
  2. 在 C# 端设置 modifydate 值

我的实体:

public class Item
{  
    public Guid? ItemId { get; set; }

    public string SomeData { get; set; }

    public DateTime CreateDate { get; set; }

    public DateTime? ModifyDate { get; set; }
}
4

2 回答 2

2

所有这三个值都是可选的。有时,我可能会传递一些值,比如 Id 或 CreateDate。如果我不通过,我希望 EF 从 DB 自动生成这些值,否则取我通过的值。

这在 EF 中是不可能的。EF 仅支持两种机制:

  • 价值始终由应用程序提供
  • 值始终由数据库使用标识或计算设置提供

原因是数据库处理默认值的方式。仅当 INSERT 命令未显式设置列但 EF 始终显式设置所有列时才使用它们(即使您没有设置值,因为使用了默认的 .NET 值),但标有标识或计算设置的列除外。

因此,您的方案需要第三种机制:

  • 如果默认值不存在或包含 .NET 默认值,则使用触发器设置默认值

问题是,如果不将属性标记为计算属性或身份属性,您将无法自动取回这些值。如果您插入新记录或更新现有记录,您的实体实例仍将包含旧值(或默认 .NET 值),除非您强制对数据库进行新查询以刷新当前实体。这就是存在身份和计算设置的原因——在插入或更新期间自动取回这些值。

当您使用 EF 时,所有这些更改都应该在您的应用程序中进行,而不是通过触发器在数据库中进行。

于 2012-05-29T08:43:00.017 回答
0
  • 您可以在 的构造函数中设置默认值Item
  • 对于修改日期,我总是使用数据库触发器,因为您不想依赖不同机器上的时钟。
于 2012-05-29T07:10:29.000 回答