【问题标题】:Making use of a generated entity's class constructor when using Entity Framework Database First在使用 Entity Framework Database First 时使用生成的实体的类构造函数
【发布时间】:2013-06-30 10:48:27
【问题描述】:

我使用的是 Database First,每次更新我的架构时,我都会更新 EDMX 文件,它会为我的模型生成新的类。不幸的是,它不会生成我在数据库中指定的默认列值(例如 'TimeStamp' 的列默认为 'getdate()')。

生成的Student.cs 类如下所示:

namespace ABC.Data
{
    using System;

    public partial class Student
    {
        public Student()
        {

        }

        public int StudentID { get; set; }
        public string Name { get; set; }
        public Nullable<System.DateTime> TimeStamp { get; set; }
    }
}

有没有办法让构造函数始终将TimeStamp 设置为当前日期?我尝试在同一个名称空间中创建一个具有相同名称等的辅助部分类,但它不起作用。也许我做错了助手类。理想情况下,即使在生成新模型类之后,我也希望帮助程序类保持不变。

【问题讨论】:

  • 我不确定我是否理解。构造函数中的TimeStamp = DateTime.Now 不起作用?
  • 确实如此,但它是一个生成的类,我不想对其进行更改。我经常重新生成我的模型。
  • EntityFramework 使用 T4 模板来生成代码。幸运的是,您可以用自己的模板替换此模板(或修改现有模板),以将其扩展到您的需要。在这里,您可以修改生成的类型构造函数。我们曾经使用它通过自动匹配接口来扩展类。
  • 谢谢!可以发个例子吗?

标签: c# entity-framework oop entity-framework-5


【解决方案1】:

DbContext 类有一个名为 ObjectMaterialized 的事件,您可以连接到该事件...

context.ObjectMaterialized += ObjectContext_OnObjectMaterialized

此事件处理程序可以应用默认值。

private void ObjectContext_OnObjectMaterialized(
    object sender, ObjectMaterializedEventArgs e)
{
    if (e.Entity is Student)
        (e.Entity as Student).TimeStamp = <default value>;
}

当您需要 Student 的新实例而不是新建实例时,您需要记住使用 context.Set&lt;Student&gt;().Create()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    相关资源
    最近更新 更多