在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. c语言-完全背包问题

    完全背包问题 问题:有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 分 ...

  2. 车牌识别--OMAP4430处理器上測试

    OMAP4430(ME865) arm-linux-gcc 4.5.1(FriendlyARM) 软浮点执行结果: root@lj:/workspace/carid# arm-linux-gcc ca ...

  3. 根据百度地图API获取指定地点的经纬度

    做项目时,遇到对地点获取地图中对应的经纬度,作一下笔记,以备以后直接使用 package com.hpzx.data; import java.io.BufferedReader; import ja ...

  4. iOS 7 中 StoryBoard 总体缩放

    iOS 7 中 StoryBoard 总体缩放 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用 ...

  5. spring 监听器简介

    在java web项目中我们通常会有这样的需求:当项目启动时执行一些初始化操作,例如从数据库加载全局配置文件等,通常情况下我们会用javaee规范中的Listener去实现 常用的监听器有spring ...

  6. 嵌套的EasyUI 怎么获取对象

    说明: 1.本篇文章介绍的是,怎么获取嵌套的Easyui 中的id为pageDetail的iframe对象 2.刚开始的页面效果如下图,是一个只有north,center区域的easyUI  easy ...

  7. mongodb学习之:聚合

    @font-face { font-family: "Times New Roman"; }@font-face { font-family: "宋体"; }p ...

  8. 软件版本GA,RC,alpha,beta含义

    软件版本GA,RC,alpha,beta含义 (1)RC:(Release Candidate) Candidate是候选人的意思,用在软件上就是候选版本.Release.Candidate.就是发行 ...

  9. 头文件---#include<***.h>和#include"***.h"的区别

    采用"< >"方式进行包含的头文件表示让编译器在编译器的预设标准路径下去搜索相应的头文件,如果找不到则报错. 例如:VS的安装目录\Microsoft Visual S ...

  10. P1604&P1601

    [usaco2010]冲浪_slide 受到秘鲁的马丘比丘的新式水上乐园的启发,Farmer John决定也为奶牛们建一个水上乐园.当然,它最大的亮点就是新奇巨大的水上冲浪. 超级轨道包含 E (1 ...