c# - 使用 Code First EF4.1 保存时如何将默认值添加到属性?

标签 c# entity-framework entity-framework-4.1

我首先创建了一些这样的模型:

public abstract class EditableBase
{
    public DateTime CreatedOn { get; set; }
    public DateTime ModifiedOn { get; set; }

    public int CreatedBy { get; set; }
    public int ModifiedBy { get; set; }
}

public class Project : EditableBase
{
    public int ProjectId { get; set; }
    public string ProjectName { get; set; }
}

我在应用程序启动时使用这一行:

Database.SetInitializer<ModelContext>(
            new DropCreateDatabaseIfModelChanges<ModelContext>());

创建了一个名为 Projects 的表,其中包含上述所有属性作为列...这正是我想要的。

但是,现在我需要在 DbContext 上发出 SaveChanges() 时填充一些默认值。保存时,我需要使用适当的值更新 ModifiedOn 和 ModifiedBy 属性。

通常我至少会在数据库端(触发器或存储过程)执行 DateTime 值,但这显然不是一个选项,因为只要类发生更改,数据库就会被删除。由于我首先编写代码,所以我没有可以调整属性的模型设计器。

我想做的是在 EditableBase 类中添加一个方法,该方法在执行 SaveChanges() 时被调用,从而将所有涉及的逻辑保存在一个地方。是否有可能做到这一点?实现我的目标的最佳方式是什么?

最佳答案

在派生的 DbContext 中覆盖 SaveChanges:

public override int SaveChanges()
{
    foreach(var entry in ChangeTracker.Entries<EditableBase>())
    {
        var entity = entry.Entity;
        if (entry.State == EntityState.Added)
        {
            entity.CreatedOn = ...;
            entity.CreatedBy = ...;
        }
        else if (entry.State == EntityState.Modified)
        {
            entity.ModifiedOn = ...;
            entity.ModifiedBy = ...;
        }
    }

    return base.SaveChanges();
}

我只是不确定通用 Entries 是否可以直接与您的基类型一起使用,因为它实际上并未映射为基实体。还有非通用版本,因此您可以将其重写为更复杂的 linq 查询或在循环中测试每个条目的实体类型。

关于c# - 使用 Code First EF4.1 保存时如何将默认值添加到属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5500464/

相关文章:

c# - EF 联盟问题“无法从 <AnonymusType#1 转换为 AnonymusType#2>

.net - 在哪里使用工作单元模式验证我的实体?

entity-framework-4.1 - 实体状态设置为修改而不是删除

c# - 异步处理消息时的BasicAck

c# - 使用 Roslyn codefix 向方法参数添加属性

c# - 如何在 LINQ 中减去两个日期?

c# - 为什么 Entity Framework Code-First(使用现有数据库)一直尝试从 EdmMetadata 表中获取数据?

entity-framework - 使用Fluent API的 Entity Framework 代码优先映射外键

c# - StringBuilder,在值之间添加制表符

c# - JavaScript 集成测试框架