用于 Asp.Net MVC 5 应用程序中所有模型的 Models.ApplicationDbContext?
Posted
技术标签:
【中文标题】用于 Asp.Net MVC 5 应用程序中所有模型的 Models.ApplicationDbContext?【英文标题】:Models.ApplicationDbContext for all models in an Asp.Net MVC 5 application? 【发布时间】:2013-11-30 10:39:12 【问题描述】:我正在创建一个 Asp.Net MVC 5 网站。 我需要在 ApplicationUser 中添加自定义字段,并将其与其他模型关联(添加外键)。我认为我应该只使用一个上下文类型。但是,代码脚手架已经生成了以下ApplicationDbContext
类。我可以把我所有的public DbSet<...> ... get; set;
都放在课堂上吗?还是有更好的模式?
namespace MyApp.Models
// You can add profile data for the user by adding more properties to your User class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
public class ApplicationUser : User
public class ApplicationDbContext : IdentityDbContextWithCustomUser<ApplicationUser>
【问题讨论】:
我在我的设置中缺少这个文件,你能给我完整的文件名并用这个文件中的所有代码更新上面的代码吗? 使用单个 ApplicationDbContext 应该避免迁移文件夹中的子文件夹带来一些额外的头痛吗?不止一个上下文确实需要这种开销 afaik。 这是一个非常有用的问题,但遗憾的是答案很糟糕...... 【参考方案1】:有一个很好的视频解释了这个问题。 只需查看 Scott Allen 的免费 ASP.NET MVC 5 Fundamentals 课程。 确切的answer is here(从 3:30 开始)。
【讨论】:
是的,那个教程链接确实解释得很好。您只需要在新的上下文中重用连接字符串,它现在存储在config.json
而不是 BaseClass 构造函数中。
我强烈推荐这个视频。只需 10 分钟。
想在这里总结一下答案,以防有一天视频链接中断?
为什么没有明确的方法来使用 ASP.NET 执行此操作?尽管该视频很有帮助,但它留下了很多关于这是否是一个想要在生产网站中使用的干净实现的问题。
视频仍然存在于 Pluralsight 上:Scott Allen 的 ASP.NET MVC 5 Fundamentals;模块:6(“实体框架 6”),剪辑:2(“启动”)。课程网址:link,准确剪辑网址:link。【参考方案2】:
我建议将它们分开。确实没有理由将系统的两个部分耦合在一起。要添加另一个 DbContext,只需向模型中添加一个名为 YourContext.cs 的文件。
public class YourContext: DbContext
public YourContext() : base("name=YourContext")
// Add a DbSet for each one of your Entities
public DbSet<Room> Rooms get; set;
public DbSet<Meal> Meals get; set;
然后在根 web.config 中
<add name="YourContext" connectionString="Data Source=(localdb)\v11.0; Initial Catalog=YourContext; Integrated Security=True"" providerName="System.Data.SqlClient" />
当您在 包管理器控制台 中运行 enable-migrations 时,系统会询问您要迁移哪个 dbcontext。选择 YourContext。
编辑:无需添加存储库/工作单元,实体框架会为您执行此操作。
【讨论】:
所以基本上你的意思是拥有两个独立的数据库? 是的。当站点发布到服务器时,EF 将合并数据库...... EF 为您做了这么多,几乎到了在开发过程中您没有考虑应用程序的数据库架构的地步。 从应用程序中的任何位置访问用户资料。User.Identity.Name.[Method]
User.Identity.GetUserId();
User.Identity.GetUserName();
@stink 这个方法我用过,但是在部署应用的时候让我很头疼。如果您只有一个启用迁移的上下文,它将自动应用挂起的迁移。但是对于两个或多个上下文,它实际上并不能正常工作,您必须在每个更改的上下文上手动运行 Update-Database。还是我做错了什么?
@Geethanga 查看下面的帖子。我会先相信 Scott Allen 的解决方案。【参考方案3】:
请注意:这是在 ALLOT 更改的 beta2 中编写的!希望大部分都能坚持,但在 RC 之前无法保证。
不要使用 NuGET 包管理器(直到 RC),因为它不会提取所需的 .NET 5 包,它会安装 EF 6 并弄乱您的项目。 (我们在 EF 7 之后)
在projects.json
中你需要有以下依赖。 (或 beta2 发布时,或 RC 上的最新版本)
"EntityFramework": "7.0.0-beta1",
"EntityFramework.Relational": "7.0.0-beta1",
"EntityFramework.Commands": "7.0.0-beta1",
"EntityFramework.Migrations": "7.0.0-beta1",
"EntityFramework.SqlServer": "7.0.0-beta1"
添加一个新文件夹 DBContexts 并添加一个包含新上下文内容的 c sharp 文件。
public class BlaBlaDB : DbContext
public DbSet<Models.MyOtherModel> MyOtherModels get; set;
protected override void OnConfiguring(DbContextOptions options)
options.UseSqlServer();
并确保在您的config.json
中添加一个连接字符串,与 IdentityDB 完全相同,只是使用您的新名称。然后在startup.json
注册你的数据库。
services.AddEntityFramework(Configuration)
.AddSqlServer()
.AddDbContext<DataContexts.IdentityDB>()
.AddDbContext<DataContexts.BlaBlaDB>();
这必须编译,因为 k 将运行这个项目并使用启动来注入你的上下文,然后执行你需要的一切。截至目前,VS2015 Beta 没有所有/或它们不起作用,EF 的命令。
您需要安装 KRE for Windows。
打开命令提示符,浏览到您的项目目录,输入解决方案并输入以下命令。
k ef context list
k ef migration add -c (context.from.above) initial
k ef migration apply -c (context.from.above)
您现在可以进行多上下文迁移。只需继续添加上下文并根据需要重复此操作。我在 localdb 上使用它作为默认项目设置,以便它可以在任何环境(如 Linux)中独立工作。
请注意:您仍然需要创建一个包含接口和实现的服务,然后在startup.json
More information here 中注册它
【讨论】:
是否可以在DataContexts.BlaBlaDB
中的表上创建外键约束来引用DataContexts.IdentityDB
中的表?
Ahhhhh .....这可能是不可能的。我对此也很新鲜,但我希望有办法。单独的上下文可能会导致问题,但让我们看看。您是否设法在 EF6 中做到这一点?这里还缺少服务部分(接口注入)。我需要补充一点,现在一切都是 DI.. 呃... 不太喜欢,但我想这是前进的方向。以上是关于用于 Asp.Net MVC 5 应用程序中所有模型的 Models.ApplicationDbContext?的主要内容,如果未能解决你的问题,请参考以下文章
Azure 中的捆绑不适用于 bootstrap 和 jquery、ASP.NET MVC 5