C# 如何定义实体列,使其在创建时具有默认值,但可以通过实体框架覆盖?
在我的C# 如何定义实体列,使其在创建时具有默认值,但可以通过实体框架覆盖?,c#,entity-framework,C#,Entity Framework,在我的Users表中,我有一个名为CreatedOn的列,它的“默认值或绑定”设置为(getdate())。在该模型的.edmx文件中,我将此列定义为 优点:该字段在创建时设置为当前时间戳 缺点:我无法通过实体框架更改字段 但是,我可以将.edmx文件中的字段定义更改为StoreGeneratedPattern=“None”,这将提供: 优点:我可以在创建实体框架后随时更改字段 缺点:该字段在创建时未设置为当前时间戳 问题在于,当我在.edmx文件中为此列指定StoredGenerate
Users
表中,我有一个名为CreatedOn
的列,它的“默认值或绑定”设置为(getdate())
。在该模型的.edmx文件中,我将此列定义为
- 优点:该字段在创建时设置为当前时间戳
- 缺点:我无法通过实体框架更改字段
StoreGeneratedPattern=“None”
,这将提供:
- 优点:我可以在创建实体框架后随时更改字段
- 缺点:该字段在创建时未设置为当前时间戳
StoredGeneratedPattern=“None”
时,实体框架发送一个值0001-01-01 00:00:00
,然后覆盖数据库默认值,而不是让数据库自己设置GETTIME()。我通过记录实体发送的SQL语句知道这一点:插入[dbo].[Users]([LoginName],[Password],…,[CreatedOn])值(@0,@1,…,@7),其中@7='0001-01-01 00:00:00'(Type=DateTime2)
我要做什么才能得到这个:
- 优点:该字段在创建时设置为当前时间戳
- 优点:通过实体框架创建后,我可以随时更改此字段的值
CreatedOn
设置为DateTime来减轻缺点。现在在保存应用程序代码之前,请执行。因此,CreatedOn
道具完全由应用程序中的应用程序代码管理,但如果直接在数据库中创建了用户
,则默认约束将生效
下面是一些方法,可以根据情况使用设置CreatedOn
:
在保存之前设置它,就像设置任何其他属性一样
正如注释中提到的ESG,在无参数构造函数中设置它
如果您使用的是EF之上的抽象层,比如repository模式,那么您可以创建一个抽象基类或接口,其中包含CreatedOn
属性,并在您想要添加该属性的任何类中继承/实现。然后创建一个基本存储库保存方法,该方法检查要保存的对象是否属于具有CreatedOn
属性的类型,如果是,则在保存之前设置它
时间戳列不会创建为供用户修改。只有英孚。那么,为什么不创建一个新的列RowVersion并将其用作更常见的时间戳呢?您通常是对的,但在本例中,我正在编写一个导入模块,在某些情况下,该模块必须导入具有相同电子邮件的多个用户记录,此时我必须确定哪个是最新的,并用最新的CreatedOn
值覆盖当前数据库记录。是否考虑过在无参数构造函数中设置默认值?问题是,它将是类创建日期,而不是记录的日期,但取决于您的目标,可能是一个选项