如何定义Entity列以使其在创建时具有默认值,但可以通过Entity Framwork覆盖?

时间:2018-05-31 11:40:16

标签: c# entity-framework

在我的Users表中,我有一个名为CreatedOn的列,其“默认值或绑定”设置为(getdate())。在此模型的.edmx文件中,我将此列定义为<Property Name="CreatedOn" Type="datetime2" Precision="7" Nullable="false" StoreGeneratedPattern="Computed"/>

  • 优势:该字段在创建时设置为当前时间戳
  • 缺点:我无法通过实体框架
  • 更改字段

但是,我可以将.edmx文件中的字段定义更改为StoreGeneratedPattern="None",这样就可以了:

  • 优势:我可以在创建后通过Entity Framework
  • 随时更改字段
  • 缺点:该字段未在创建时设置为当前时间戳

问题是实体框架,当我在.edmx文件中为此列指定StoredGeneratedPattern="None"时,而不是让数据库自己设置GETTIME(),而是发送一个值0001-01-01 00:00:00,然后覆盖数据库默认值。我知道这是通过记录实体发送的SQL语句:INSERT [dbo].[Users]([LoginName], [Password], ..., [CreatedOn]) VALUES (@0, @1, ..., @7) where @7 = '0001-01-01 00:00:00' (Type = DateTime2)

我必须这样做才能得到这个:

  • 优势:该字段在创建时设置为当前时间戳
  • 优势:我可以在创建后通过实体框架随时更改此字段的值

1 个答案:

答案 0 :(得分:0)

您可以使用第二种方法,在保存应用代码之前将CreatedOn设置为DateTime.Now,从而减​​轻劣势。因此,CreatedOn道具完全由应用中的应用代码管理,但如果直接在数据库中创建User,默认约束将会启动。

以下是根据具体情况设置CreatedOn的几种方法:

  1. 在保存之前设置它,就像您设置任何其他属性一样。
  2. 正如评论中提到的ESG,将其设置在无参数构造函数中。
  3. 如果你像在存储库模式上那样在EF之上使用抽象层,你可以创建一个包含CreatedOn属性的抽象基类或接口,并在你想要的任何类中继承/实现将该道具添加到。然后创建一个基本存储库保存方法,检查正在保存的对象是否具有CreatedOn属性的类型,如果是,则在保存之前进行设置。