EF部分类和默认值

时间:2010-11-05 03:51:47

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

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

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

所以..我没有创建75个需要维护的部分类,而是创建每个EF类型继承的基类,它继承了默认构造函数来填充Created和Modified的DateTime值。 ?

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

2 个答案:

答案 0 :(得分: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)....

答案 1 :(得分:1)

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

的行
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模板,但这对您来说可能就足够了。