Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何定义实体列,使其在创建时具有默认值,但可以通过实体框架覆盖?_C#_Entity Framework - Fatal编程技术网

C# 如何定义实体列,使其在创建时具有默认值,但可以通过实体框架覆盖?

C# 如何定义实体列,使其在创建时具有默认值,但可以通过实体框架覆盖?,c#,entity-framework,C#,Entity Framework,在我的Users表中,我有一个名为CreatedOn的列,它的“默认值或绑定”设置为(getdate())。在该模型的.edmx文件中,我将此列定义为 优点:该字段在创建时设置为当前时间戳 缺点:我无法通过实体框架更改字段 但是,我可以将.edmx文件中的字段定义更改为StoreGeneratedPattern=“None”,这将提供: 优点:我可以在创建实体框架后随时更改字段 缺点:该字段在创建时未设置为当前时间戳 问题在于,当我在.edmx文件中为此列指定StoredGenerate

在我的
Users
表中,我有一个名为
CreatedOn
的列,它的“默认值或绑定”设置为
(getdate())
。在该模型的.edmx文件中,我将此列定义为

  • 优点:该字段在创建时设置为当前时间戳
  • 缺点:我无法通过实体框架更改字段
但是,我可以将.edmx文件中的字段定义更改为
StoreGeneratedPattern=“None”
,这将提供:

  • 优点:我可以在创建实体框架后随时更改字段
  • 缺点:该字段在创建时未设置为当前时间戳
问题在于,当我在.edmx文件中为此列指定
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
    值覆盖当前数据库记录。是否考虑过在无参数构造函数中设置默认值?问题是,它将是类创建日期,而不是记录的日期,但取决于您的目标,可能是一个选项