如何在Entity Framework中使用DataBase的默认列值?

时间:2009-02-25 03:03:00

标签: .net entity-framework

我在表中有一个Date列,其默认值或绑定为getutcdate()。我想在实体框架中使用它。在生成EDM时,我能够在列级别找到“默认值”属性,但我认为它适用于硬编码值。

请告诉我如何使用数据库中指定的默认值。

9 个答案:

答案 0 :(得分:9)

为实体实现OnCreated事件是我找到的解决方案。我有一个Guid属性,我想填充。默认情况下,它填充了全零(00000-0000-00000等)。通过将以下内容添加到我的实体的部分类中,我能够处理该问题。

partial void OnCreated()
{
    Guid = Guid.NewGuid();
}

答案 1 :(得分:4)

StoreGeneratedPattern =“Computed”与默认值不同,因为此属性每次都会使用数据库中的默认值进行更新。这意味着无法手动更新它。

答案 2 :(得分:4)

您可以将StoreGeneratedPattern设置为Identity,在这种情况下,EF会在执行INSERT语句后读取从数据库返回的值。这种方法的问题在于,下次生成XML映射时,您的更改将会丢失。

另一种方法是将代码中的值自己设置为DateTime.UtcNow。您可以在实体的构造函数中设置它(如果需要,可以定义一个新的构造函数),或者您可以在自己的事件处理程序中为上下文的SavingChanges事件设置它(有关处理SavingChanges事件的示例,请参阅How to: Execute Business Logic When Saving Changes (Entity Framework))。 / p>

答案 3 :(得分:4)

设置StoreGeneratedPattern =“Computed”或“Identity”的问题是它们不允许客户端提供值。在插入时遇到此问题,但也有更新。

似乎StoreGeneratedPattern需要另外一个或两个选项,因此数据库至少可以看到用户提供的值,但如果需要可以覆盖它。这将允许任何现有的数据库插入或更新触发器根据另一个字段更新一个字段。例如,更新时的数据库触发器可能仅在未提供修改时间戳时更新修改后的时间戳,并且仅在某些字段更新时才更新。

也许SQL Server中的列扩展属性功能可以在提取过程中自动设置该字段,因此我们不会最终编辑XML文件。

答案 4 :(得分:1)

本文中建议使用部分类和构造函数中的方法来设置值。

How to use the default Entity Framework and default date values

答案 5 :(得分:0)

这是一种可行的,但不是很好的解决方法 -

在列上设置Computed将使其成为只读,但会使默认值有效。可以有一个真实的Computed列,比如说“LastChangedAt_computed”,它可以显示“LastChangedAt_default”或“LastChangedAt_manual”的值。

现在,计算列显示默认列的值,除非手动列不为null,在这种情况下会显示它。在模型中,默认列的StoragePattern需要为“Computed”。

这是一个丑陋的解决方案,但它应该有效。

答案 6 :(得分:0)

为实体模型创建一个部分类非常简单,类似于您对数据注释所做的操作。然后我覆盖默认构造函数并在构造函数中设置默认属性。像魅力一样。

public partial class CallHistoryLog
{
    public CallHistoryLog() 
    {
        this.NumberFromId = -1L;
        this.NumberFromName = "NO NAME";
        this.NumberToId = -1L;
        this.NumberToName = "NO NAME";
        this.RouteId = -1L;
        this.Viewed = false;
        this.Deleted = false;
        this.DateCreated = DateTime.Now;
    }
}

答案 7 :(得分:0)

嗯......如果你使用EF6,这实际上比你想象的要容易得多。只需打开模型,右键单击要为其设置默认值的列,选择属性,您将看到" DefaultValue"领域。只需填写并保存即可。它会为你设置代码。

其他一些解决方案的问题是,虽然它们可能最初工作,但只要重建模型,它就会丢弃您插入到机器生成的文件中的任何自定义代码。

因此,UI通过向edmx文件添加额外属性来实现:

<EntityType Name="Thingy">
  <Property Name="Iteration" Type="Int32" Nullable="false" **DefaultValue="1"** />

通过向构造函数添加必要的代码:

public Thingy()
{
  this.Iteration = 1;

答案 8 :(得分:0)

插入多数民众赞成格式:

    //class
    [Column("guid")]
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public string guid_ { get; set; }
    ...
    //end class

在命令yourContext.SaveChanges();

之后

您可以在类模型中看到从数据库返回默认数据。

好看