Entity Framework with Owin DbContext per request in MVC
我注意到,当使用单个用户帐户时,MVC的项目模板将一些对象放在当前的OWIN上下文中(在
1 2 3 4 | // Configure the db context, user manager and signin manager to use a single instance per request app.CreatePerOwinContext(ApplicationDbContext.Create); app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); |
看起来这是为了访问数据库中的标识功能。我的理解是,每个请求创建一个
例如,我在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public partial class Startup { public void ConfigureData(IAppBuilder app) { app.CreatePerOwinContext(CreateParkingEntities); } protected ParkingEntities CreateParkingEntities() { return new ParkingEntities(); } } |
然后在
1 2 3 4 5 6 7 8 | public partial class Startup { public void Configuration(IAppBuilder app) { ConfigureAuth(app); ConfigureData(app); } } |
然后我可以在控制器中使用上下文:
1 2 3 4 5 6 7 8 9 10 11 12 13 | private ParkingEntities _db; public ParkingEntities DbContext { get { return _db ?? HttpContext.GetOwinContext().Get<ParkingEntities>(); } private set { _db = value; } } |
我认为如果这是标准实践,那么实体框架将为此提供一些框架,但它只是在控制器级别创建一个实例。假设仅从该控制器访问
如果需要额外的设置,我想这种方法的另一个用途是dbContext的单个初始化点。
注意,如果在dbset上使用
如果您将
使用EFDB上下文的主要方法很简单:连接到DB上下文,获取数据并忽略这个DB上下文对象。ef上下文是IDisposable的,并在释放后关闭连接(不要忘记使用())。这意味着,当应用程序需要数据库连接时,可以在应用程序的任何位置创建EF数据上下文。如果控制器操作正在使用DB,则可以在其内部创建新的DB上下文。一切都取决于应用程序的体系结构。如果您确定,对您的应用程序的所有请求都需要许多DB操作,我认为您的解决方案(每个OWIN上下文都有DB上下文)是有用的。