【发布时间】:2016-10-26 08:02:42
【问题描述】:
我正在尝试使用 EF 迁移来构建/植入我的数据库,但是当我使用 update-database 命令时,我的 DbContext 导致错误。
我实现的 DbContext 有两个构造函数:一个不接受参数,另一个接受 IUserContext 接口。 IUserContext 接口将用户名作为字符串返回。 IUserContext 用于 SaveChanges() 方法,用于设置我的所有实体共有的与用户相关的审计字段(例如 CreatedBy、UpdatedBy)。根据 IUserContext 接口的实现,可以从 HttpContext(在 mvc 应用中)、WindowsIdentity(在控制台应用中)等中检索用户名。
如果用户尝试在 DbContext 上调用 SaveChanges 并且未设置 IUserContext,则会引发异常。基本上,如果 IUserContext 接口无法提供用户名以记录谁在进行修改,我不希望将更改保存在 DbContext 中。 如果 DbContext 正在仅用于查询,使用无参数构造函数不是问题,因为 IUserContext 仅在 SaveChanges 期间使用。
当我尝试使用 update-database 命令时,会为 DbMigrationsConfiguration 提供一个使用无参数构造函数实例化的 DbContext 实例。因此,它在 Seed() 方法之后尝试调用 DbContext 的 SaveChanges 时会引发异常。
问题:如何将 IUserContext 传递给我的 DbContext,以便 update-database 命令不会失败,更重要的是,能够将适当的实体字段设置为播种用户的名称更改? 我可以在 DbMigrationsConfiguration 中执行某种形式的 DI 或其他自定义吗?我是否应该简单地将 IUserContext 访问器方法添加到 DbContext 以便可以在构造函数之外设置 IUserContext?
也许我应该问一个更大的问题:为了记录谁在进行修改,将用户信息传递到 DbContext 的最佳(最通用?)方式是什么 i>?
我考虑过将这个逻辑转移到我的应用程序的业务层,但是将它封装在 DbContext 的 SaveChanges 中似乎很方便(启用更改跟踪时更是如此)。【问题讨论】:
标签: entity-framework ef-code-first dbcontext