0

此处的 SO 讨论之后,我实现了部分类,以便为构造函数中的 Created 和 Modified 数据库字段创建默认日期时间值。

现在的问题是我的数据库有 100 多个表,其中 75 多个表具有相同的基本结构,包括 Created 和 Modified 列定义。

所以..不是创建我需要维护的 75 个以上的部分类,有什么方法可以创建一个基类,每个 EF 类型都继承自,它继承默认构造函数来填充 Created 和 Modified 的 DateTime 值?

编辑:值得注意的是我使用的是 EF 4.0

4

2 回答 2

1

您当然可以告诉 EF 为您的实体使用基类(它在设计器中作为实体的属性)...但是如果您想确保该字段的默认值,也许您可​​以挂钩您的 ObjectContext SavingChanges 和 ObjectMaterialized 上的两个事件。

http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.savingchanges.aspx

http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.objectmaterialized.aspx

您可以利用这些机会注入您想要使用的默认值。因此,例如,在您的 SavingChanges 处理程序中,您可以检查上下文中的 ObjectStateManager 以查看相关实体的状态是否为 EntityState.Added,然后根据需要设置 Created 和 Modified 日期。

或者,如建议的那样,SQL Server 中列的默认值不能只是 GetDate() 是否有原因?(假设您使用的是 SQL Server)......

于 2010-11-05T04:26:21.360 回答
1

您当然可以使用 EF4 和 EF1 指定您自己的基类,尽管使用 EF4 更容易。右键单击设计图面,您应该会看到添加代码生成项的选项。选择 ADO.Net 实体对象生成器。这将为您的项目(.tt 扩展名)指定一个 T4 文件,该文件指定用于从模型生成实体类的模板。要指定不同的基类,请在其中查找类似的行

Private Function BaseTypeName(ByVal entity As EntityType, ByVal code As CodeGenerationTools) As String
    Return If(entity.BaseType Is Nothing, "EntityObject", MultiSchemaEscape(DirectCast(entity.BaseType, StructuralType), code))
End Function

将 EntityObject 替换为您的基类。请注意,如果您使用此模板,那么您的基类必须继承自 System.Data.Objects.DataClasses.EntityObject - 您可以改用 POCO 模板,但这对您来说可能就足够了。

于 2010-11-05T09:38:41.843 回答