EF Code First - Identity&计算列

时间:2012-05-29 06:17:31

标签: entity-framework entity-framework-4 ef-code-first

我创建了一个名为'Item'的实体。它有一个Id,CreateDate和ModifyDate以及一些必需的数据。

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

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

到目前为止,我发现,如果我将Id列作为Identity列,则忽略提供的值,对于计算列也是如此。

无论如何,我有选择提供这些价值吗?

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

  1. 使用更新触发器更新modifydate
  2. 在C#side设置modifydate值
  3. 我的实体:

    public class Item
    {  
        public Guid? ItemId { get; set; }
    
        public string SomeData { get; set; }
    
        public DateTime CreateDate { get; set; }
    
        public DateTime? ModifyDate { get; set; }
    }
    

2 个答案:

答案 0 :(得分:2)

  

所有这三个值都是可选的。有时候,我可能会传递一些价值观   说Id或CreateDate。我希望EF自动生成这些值   如果我没有通过,请从DB获取,否则选择我已经通过的那个。

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

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

原因是数据库如何处理默认值。它们仅在INSERT命令未显式设置列时使用,但EF始终显式设置所有列(即使您未设置值,因为使用了默认的.NET值),除了标有identity或computed设置的列。

所以你的场景需要第三种机制:

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

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

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

答案 1 :(得分:0)

  • 您可以在Item
  • 的构造函数中设置默认值
  • 对于修改日期,我总是使用数据库触发器,因为您不想依赖不同机器上的时钟。