【问题标题】:EF partial classes and default valuesEF 部分类和默认值
【发布时间】:2010-11-05 03:51:47
【问题描述】:

SO dicsussion here 开始,我实现了部分类,以便在构造函数中为我的 Created 和 Modified 数据库字段创建默认日期时间值。

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

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

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

【问题讨论】:

  • 你没有使用StoreGeneratedPattern="Computed"有什么原因吗?
  • 因为我的理解是每次更新对象时都会覆盖它。
  • 此行为在此处得到验证:msdn.microsoft.com/en-us/library/…

标签: c# .net entity-framework partial-classes sql-server-2008-r2


【解决方案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 模板,但这对您来说可能就足够了。

【讨论】:

    【解决方案2】:

    您当然可以告诉 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)....

    【讨论】:

    • 谢谢杰夫。是的,由于某种原因,默认值不会从 SQL Server 传播到 EF,实际上我已将默认值设置为 getdate(),但是当我在 EF 中填充对象时,日期设置为 SqlServer 上的 DateTime.Minimum。至于在设计器中设置基类,我看到了这一点,但它只允许您在 EF 模型中选择一个类,而不是您在设计器之外创建的类。
    猜你喜欢
    • 2021-12-14
    • 2017-07-17
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 2018-03-04
    相关资源
    最近更新 更多