从SO dicsussion here开始,我已经实现了部分类,以便为构造函数中的Created和Modified数据库字段创建默认的datetime值。
现在问题是我的数据库有100多个表,其中75个表具有相同的基本结构,包括Created和Modified列定义。
所以..我没有创建75个需要维护的部分类,而是创建每个EF类型继承的基类,它继承了默认构造函数来填充Created和Modified的DateTime值。 ?
编辑:值得注意的是我使用的是EF 4.0
答案 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模板,但这对您来说可能就足够了。