在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. 内核顶层Makefile相关4

    http://www.groad.net/bbs/simple/?f104.html make 的递归执行与 MAKEFLAGS 变量 make 的递归调用是指:在 Makefile 中使用 make ...

  2. Python中cv2库和matplotlib库色彩空间排布不一致

    今天在python中读如图片时发现以下问题: 1.在from matplotlib import pyplot as plt之后,再import cv2 cv2.imshow()不能正常使用,还不知道 ...

  3. mysql连接超时的问题

    使用Hibernate + MySQL数据库开发,链接超时问题: com.mysql.jdbc.CommunicationsException: The last packet successfull ...

  4. php中屏蔽date的错误

    php中添加  date_default_timezone_set('asia/shanghai'); 可以屏蔽 <?php echo date('Y-m-d',$row3['time']); ...

  5. cocos2d-x lua 中使用protobuf并对http进行处理

    cocos2d-x lua 中使用protobuf并对http进行处理 本文介绍 cocos2d-x lua 中使用http 和 基于cocos2d-x 对lua http的封装(部分ok) 本博客链 ...

  6. maven的基本原理和使用

    一.Maven中央存储库 当你建立一个 Maven 的项目,Maven 会检查你的 pom.xml 文件,以确定哪些依赖下载.首先,Maven 将从本地资源库获得 Maven 的本地资源库依赖资源,如 ...

  7. 九度OJ 1092:Fibonacci (递归)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1923 解决:1378 题目描述: The Fibonacci Numbers{0,1,1,2,3,5,8,13,21,34,55...} ...

  8. 【LeetCode】Binary Tree Inorder Traversal

    Binary Tree Inorder Traversal Total Accepted: 16406 Total Submissions: 47212My Submissions Given a b ...

  9. SQL 关联操作

  10. HTTP1.1学习笔记 -- RFC2616

    本人跟web无缘,从来没有想去学http,现在看来,学学也是有益无害,总会要用着点滴. RFC见这里: https://www.ietf.org/rfc/rfc2616.txt 0. URI格式 ht ...