长期潜伏者,第一次海报。
我在这里找到了大量关于如何使用 CodeFirst 在存储库之间共享 dbContext 的内容,但我似乎无法将其与我正在处理的项目联系起来,该项目不使用代码优先或依赖注入。
首先,了解一下该项目的背景知识,以确保我以正确的方式处理这个问题。我参加了这个项目,他们首先使用的是 EF4 和数据库。我远非 EF 专家,但我现在摸索了几个不同的项目。
我不得不实现几个不同的要求,这些要求迫使我在他们的“服务”级别和数据库之间进行干预。换句话说,他们的对象直接调用 EF db 对象,例如
using (var db = new MYDB()){
var bar = db.Foo
.Include("Transactions")
.Include("blah")
.Where(...);
//do stuff
db.SaveChanges();
}
我必须做的一件事是跟踪所有发生变化的字段,所以我抽象了一个关卡,现在我们有了
FooObject bar = GetFooObject(...);
bar.Title = "asdfasdf";
//do stuff to bar
bar.Save();
它将所有字段包装到属性中,以便我可以注销任何更改。在 bar.save 中,我打开一个 db 上下文,获取现有的 Foo 或创建一个新的,分配所有值,然后调用 db.SaveChanges。
事实证明,他们还基于 Transactions 和 blah 进行大量子查询。所以当他们做类似的事情时
var bar = GetFooObject(...);
var t = new Transaction();
//do stuff to t
...
bar.Transactions.Add(t);
bar.Save();
我遇到各种上下文错误,说 dbcontext 不再可用等。我完全理解。我不知道如何解决它。我已经看到了很多关于在使用之前创建 dbContext 然后将其传入的东西,但我似乎无法找出正确的方法来做到这一点,因此它可以与我的代码一起使用。
我最近的尝试基于几个关于如何将 DBContext 转换为 ObjectContext 的示例(这又基于我发现的所有关于共享连接引用 ObjectContext 而不是 DBContext 的示例)看起来像这样:
using (var db = ((IObjectContextAdapter)(new FooDB())).ObjectContext)
{
using (var context = new DbContext(db, false))
{
var bar = FooObject.GetFooObject(fooId);
Result r = bar.ProcTrans(amount,
transDate,
db.TransactionTypes
.Include(tt => tt.Description)
.SingleOrDefault(tt => tt.TypeID == transactionTypeId),
employeeId,
comment);
但是使用此代码时,我收到一个错误,即我没有 TransactionTypes 的定义。它无法识别我的任何数据库对象。
如何创建 DBContext 并将其传递给我的 FooObject 以便我可以保持打开状态以进行相关更新?我什至不知道我问的问题是否完全正确。我如何在不重新编码整个事情的情况下弥合这个差距?
编辑
这是我打开这个问题后发现的一些东西。也许两者中的一个会成功。
好吧,这个发现肯定更符合重新编码整个事情的路线,但我在寻找有关“做更改跟踪”的链接时确实发现了这一点,并带有触发器响应。
实体框架中的 poco 第 3 部分:使用 poco 进行更改跟踪
我刚刚发现如何在 asp.net 中的各种模型存储库之间共享数据上下文,这可能是一种简单的方法。