在ASP.NET 4.x中(包括ASP.NET MVC 5),可以通过附加数据库文件的方式,将数据库保存在项目的文件中。这种方式对于不同时段需要更换计算机(白天办公室,晚上家里)开发时带来好处。

而.NET Core版本(包括 ASP.NET Core MVC )数据库是默认保存在c:/users/{username}中。

一、对于ASP.NET 4.x,本来项目文件默认存在着App_Data的系统文件夹,用来存放数据库文件。

数据库连接字符串中的|DataDirectory| 表示了App_Data文件。典型的连接字符串为:

<add name="MVCMovieContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\MVCMovieContext.mdf;Initial Catalog=MVCMovieContext;Integrated Security=True" providerName="System.Data.SqlClient" />

ASP.NET 4.X中的webconfig.config文件中, 数据库连接连接字符串中的    \ 符号已自动转义,不需要额外的双斜杠\\

二、对于ASP.NET Core程序,我们一般将数据库连接字符串保存在 appsettings.json文件中。典型的连接字符串为:

"ConnectionStrings": {
"MVCMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MVCMovieContext;Trusted_Connection=True;MultipleActiveResultSets=true",
}

ASP.NET Core MVC中的appsetting.json文件中, 数据库连接连接字符串中的    \ 符号没有自动转义,出现\需要双斜杠\\来转义。

可以将appsetting.json文件中连接字符串改为 Data Source, Initial Catalog双单词表示的形式,结果一样可以正常运行。如

"ConnectionStrings": {
"MVCMovieContext": "Data Source=(LocalDb)\\MSSQLLocalDB;Initial Catalog=MVCMovieContext;Trusted_Connection=True;MultipleActiveResultSets=true"
}

但以上2种方法都只能将数据库保存本地计算机上的c:\user\{username}目录下,如果需要换台计算机继续来开发ASP.NET Core,需要拷贝2次,且程序与数据库不在同一个目录下,拷贝显得麻烦。能不能实现像ASP.NET MVC开发一样,将数据库就保存在应用程序所在的项目中呢?

肯定数据库连接字符串需要使用到附加 AttachDbFileName,但由于ASP.NET Core不将 |DataDirectory|作为默认系统文件。因此,不能直接使用 如AttachDbFilename=|DataDirectory|\MVCMovieContext.mdf;,况且默认的项目模板没有App_Data文件夹。

我们可以首先在ASP.NET Core 项目下新建一个名为App_Data的文件夹,用来存放mdf数据库文件。

1、如果的数据库连接字符串使用DataDirectory,即连接字符串为:
"Server=(localdb)\\mssqllocaldb;Database=MVCMovieContext-ServerSyntax;AttachDbFileName=|DataDirectory|\\MVCMovieContext.mdf;Trusted_Connection=True;MultipleActiveResultSets=true",

系统会报 ArgumentException: Invalid value for key 'attachdbfilename'. 的错误。

可见ASP.NET Core不能识别|DataDirectory|文件夹。

2、采用绝对路径的方式

数据库文件存放在C:\users\{username}文件夹下。

"Server=(localdb)\\mssqllocaldb;Database=MVCMovieContext-ServerSyntax;AttachDbFileName=C:\\users\\username\\MVCMovieContext.mdf;Trusted_Connection=True;MultipleActiveResultSets=true"

能够成功访问数据库。

既然绝对路径能够访问,那么我们就可以采用绝对路径的方法来设置来设置数据库连接字符串附加数据库文件。

ASP.NET Core  应用程序(ASP.NET MVC 2.2)中附加数据库文件的解决方法如下:

第一步:建立ASP.NET Core 项目下新建一个名为App_Data的文件夹,用来存放mdf数据库文件。

第二步:在AppSetting.json配置文件中设置连接字符串:

"MVCMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MVCMovieContext;AttachDbFileName=%ContentRootPath%\\App_Data\\MVCMovieContext.mdf;Trusted_Connection=True;MultipleActiveResultSets=true"//灰色部分显式设置数据库名,可选。

第三步:更改StartUp.cs配置文件

public class Startup
{
public Startup(IConfiguration configuration,IHostingEnvironment env)// 在构造函数中添加Web主机环境。
{
Configuration = configuration;
Env = env;
}

public IHostingEnvironment Env { get; };; //添加应用程序运行的Web主机环境属性,Env为只读属性。

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});

string conn = Configuration.GetConnectionString("MVCMovieContext");  //从AppSetting.json应用配置文件中读取连接字符串,值为"Server=(localdb)\\mssqllocaldb;Database=MVCMovieContext;AttachDbFileName=%ContentRootPath%\\App_Data\\MVCMovieContext.mdf;Trusted_Connection=True;MultipleActiveResultSets=true"
if (conn.Contains("%ContentRootPath%")) //判断读取的连接字符串是否包含"%ContentRootPath%"字符串
{
conn = conn.Replace("%ContentRootPath%", Env.ContentRootPath);  //用程序的根目录替换掉 =%ContentRootPath%,要区分大小写。  ContentRootPath  用于包含应用程序文件。而WebRootPath  用于包含Web服务性的内容文件,app\wwwroot\.

}

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

services.AddDbContext<MVCMovieContext>(options =>
options.UseSqlServer(conn));
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app)   //删去原来注入的env对象,改由StartUp类的构造函数注入 。原方法签名为 public void Configure(IApplicationBuilder app,,IHostingEnvironment env);
{
if (Env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}

运行程序,能够正常访问和创建数据库。

在项目的Program.cs类中的main方法中可使用Context.Database.Migrate() 使用迁移来创建数据库,使用Context.Database.EnsureCreated()来创建数据库。两者的区别在于:

I.当连接字符串所指向的数据库不存在时,

EnsureCreated,创建与现在Model匹配的数据库,不能使用迁移来更新数据库。

Migrate使用以前的所有迁移来重新创建数据库,创建的数据库中多了一个__EFMigrationsHistory表。

II.当连接字符串指向的数据库存在时:

EnsuredCreated,什么也不做。不保证现有模型与数据库匹配。 所以适用于模型快速迭代的情况,也不能保留数据库里面的数据。需要每次删除数据库,再运行程序,自动创建数据库。

Migrate,可以使用诸发控制台 add-migration name 或 命令行,dotnet ef migrations update 的迁移命令来更新数据库的结构,可以保留人工通过网页输入的测试数据。选用于测试和产品阶段。

ASP.NET Core 2.2 附加的数据文件存放在项目文件夹内的更多相关文章

  1. Asp.Net Core基于JWT认证的数据接口网关Demo

    近日,应一位朋友的邀请写了个Asp.Net Core基于JWT认证的数据接口网关Demo.朋友自己开了个公司,接到的一个升级项目,客户要求用Aps.Net Core做数据网关服务且基于JWT认证实现对 ...

  2. ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 使用 EF 框架查询数据 上一章节我们学习了如何设置 ...

  3. 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  4. asp.net core流式上传大文件

    asp.net core流式上传大文件 首先需要明确一点就是使用流式上传和使用IFormFile在效率上没有太大的差异,IFormFile的缺点主要是客户端上传过来的文件首先会缓存在服务器内存中,任何 ...

  5. 更改Oracle数据文件名及数据文件存放路径

    更改Oracle数据文件名及数据文件存放路径 SQL> select * from v$dbfile;        FILE# NAME ---------- ---------------- ...

  6. 在ASP.NET Core中使用Apworks开发数据服务:对HAL的支持

    HAL,全称为Hypertext Application Language,它是一种简单的数据格式,它能以一种简单.统一的形式,在API中引入超链接特性,使得API的可发现性(discoverable ...

  7. Asp .net core api+Entity Framework 实现数据的存取到数据库中

    最近在学dotNetCore 所以尝试了一下api 这个功能 不多说了大致实现如下 1.用vs2017建立一个Asp.net  Core Web 应用程序 在弹出的对话框中选择 Web API 项目名 ...

  8. asp.net core web 项目附加进程调试

    之前asp.net web项目在部署IIS站点的时候可以直接选择项目目录,不用发布,然后附加进程的时候,找到w3wp.exe开头的进程,再根据用户名找到要附加的进程,就可以附加进程调试了.但asp.n ...

  9. 学习ASP.NET Core Blazor编程系列八——数据校验

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

随机推荐

  1. Linux基础(4)-硬盘分区、格式化及文件系统的管理、软件包的管理、yum管理RPM包和python的源码安装

    一: 1)  开启Linux系统前添加一块大小为15G的SCSI硬盘 2)  开启系统,右击桌面,打开终端 3)  为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑 ...

  2. ORACLE 11G 单实例 磁盘文件系统 DG 归档日志删除脚本 基于RED HAT LINUX 5.3 X86 64BIT

    近期做个DG的归档日志删除, [oracle@.local logs]crontab -l * 8 * * * sh /home/oracle/dbscripts/del_arc.sh 该脚本分别调用 ...

  3. 轻松搞定RabbitMQ(五)——路由选择

    转自 http://blog.csdn.net/xiaoxian8023/article/details/48733249 翻译地址:http://www.rabbitmq.com/tutorials ...

  4. 轻松搞定RabbitMQ(一)——RabbitMQ基础知识+HelloWorld

    转自 http://blog.csdn.net/xiaoxian8023/article/details/48679609 本文是简单介绍一下RabbitMQ,参考官网上的教程.同时加入了一些自己的理 ...

  5. C递归算法与栈的分析,非全然二叉树遍历分析---ShinePans

                 对于递归,这里面的分析最好当然是用图形的方式来分析了.这里来总结一下 1.首先对于栈的理解: 先进后出,后进先出 先进后出 2.在进行非全然二叉树的存储之后,我们要做的是对其 ...

  6. Linux下Tun/Tap设备通信原理

    Tun/Tap都是虚拟网卡,没有直接映射到物理网卡,是一种纯软件的实现.Tun是三层虚拟设备,能够处理三层即IP包,Tap是二层设备,能处理链路层网络包如以太网包.使用虚拟网络设备,可以实现隧道,如O ...

  7. UVA - 11827 - Maximum GCD,10200 - Prime Time (数学)

    两个暴力题.. 题目传送:11827 Maximum GCD AC代码: #include <map> #include <set> #include <cmath> ...

  8. 创建私有maven库

    在公司搭建私有maven库,我为了在本机做测试,我选择Sonatype nexus oss,在docker里面安装 1.Mac上安装docker 下载地址:https://github.com/boo ...

  9. Xcode各个版本及模拟器下载

    如果你嫌在 App Store 下载 Xcode 太慢,你也可以选择从网络上下载: Xcode下载(Beta版打的包是不能提交到App Store上的) 绝对官方源!!!绝对官方源!!!绝对官方源!! ...

  10. ssh服务器终端乱码

    在使用 iTerm2 ssh 连接远程服务器的终端时,终端中文显示乱码.但是本地使用却没有出现中文乱码的问题,在网络上寻找了一番发现应该是服务器字符集和本地 iTerm2 设置的字符集不一致导致的,于 ...