gpt4 book ai didi

c# - Entity Framework : Code First. 共享和实例上下文

转载 作者:行者123 更新时间:2023-11-30 19:06:19 25 4
gpt4 key购买 nike

我正在使用 Entity Framework 代码优先方法和 mvc4 web 应用程序构建分层应用程序,主要分为 DataServicesWeb.

我在我的网站上这样做:

public void Foo() {
EntityService _svc = new EntityService();
Entity = _svc.FindById(1);
}

服务方法如下所示:

private readonly MyContext _ctx = new MyContext();

public Entity FindById(long id) {
return _ctx.Entities.SingleOrDefault(q => q.EntityId == id);
}

问题是当我需要使用多个服务时,因为每个服务都会创建自己的上下文。

为了解决这个问题,我做了这样的事情:

public class MyContext : DbContext {
private static MyContext _ctx;

public MyContext() : base("name=myConnectionString") { }

public static MyContext GetSharedInstance() {
return GetSharedInstance(false);
}

public static MyContext GetSharedInstance(bool renew) {
if(_ctx == null || renew)
_ctx = new MyContext();

return _ctx;
}
}

如下更改我的服务:

public class EntityService
{
private readonly MyContext _ctx;

public bool SharedContext { get; private set; }

public EntityService()
: this(false) { }

public EntityService(bool sharedContext)
: this(sharedContext, false) { }

public EntityService(bool sharedContext, bool renew)
{
SharedContext = sharedContext;

if (SharedContext)
_ctx = MyContext.GetInstance(renew);
else
_ctx = new MyContext();
}
}

现在,如果我想分享我的上下文实例,我会这样做:

EntityService _entitySvc = new EntityService(true, true);
AnotherEntityService _anotherEntitySvc = new AnotherEntityService(true);

至少,这是克服这个问题的好方法吗?我将不胜感激提供的任何帮助。谢谢。

最佳答案

从来没有,永远,永远,永远,永远……曾经……我有没有提到过?我是认真的。永远不要创建静态数据上下文。永远不能。真的。我能再强调一下吗?绝不。想都别想。想想就会得脑癌。

这是依赖注入(inject)真正发挥作用的情况之一。通过依赖注入(inject),您可以管理数据上下文的生命周期,并使它们在请求的生命周期内存活,而不是像静态一样在应用程序池的生命周期内存活。

详细说明为什么共享上下文不好。上下文不仅在您的类之间共享,而且在线程和请求之间共享。这意味着同时使用该站点的两个用户将破坏彼此的数据上下文,从而导致各种问题。数据上下文不是线程安全的,也不是并发安全的。

如果您想与多个对象共享您的数据上下文,那么您需要将其作为方法调用的一部分或作为构造函数参数传递给这些对象。

不过,我强烈建议通过依赖注入(inject)来做到这一点。

关于c# - Entity Framework : Code First. 共享和实例上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12429312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com