在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. error MSB8011: 未能注冊输出。请尝试启用“逐用户重定向”

    初试MFC就遇到困难了.vs2010创建一个MFC ActiveX控件项目. 什么都还没做呢,就出现故障了? 郁闷呀.! ! 1>C:\Program Files\MSBuild\Microso ...

  2. AMD单桥主板上电时序的详细解释

    3个待机条件: 1.桥需要得到待机电压:3.3V,1.5V/1.2V2.25M起振注:NV的RTC电路,一般不会导致时序故障,都可以出CPURST#3.PWRGD-SB(即INTEL芯片组的RSMRS ...

  3. FastDFS的配置、部署与API使用解读(8)FastDFS多种文件上传接口详解(转)

    1.StorageClient与StorageClient1的区别 相信使用happy_fish的FastDFS的童鞋们,一定都熟悉StorageClient了,或者你熟悉的是StorageClien ...

  4. linux c 网络编程:用域名获取IP地址或者用IP获取域名 网络地址转换成整型 主机字符顺序与网络字节顺序的转换

    用域名获取IP地址或者用IP获取域名 #include<stdio.h> #include<sys/socket.h> #include<netdb.h> int ...

  5. kubernetes对象之deployment

    系列目录 简述 Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用.典型的应 ...

  6. Asp.net core 初探

    写这篇博客的主要目的是加深自己的印象. 后续每天都会写一些自己的学习心得. Ubuntu :16.04 桌面版 .net core : dotnet-dev-1.0.0-preview2-003121 ...

  7. linux上查看系统内核版本命令(转载)

    uname -a uname -r 查看发行版本信息: 在RedHat系统里,存在一个/etc/redhat-release文件,里面保存了发行版的版本信息 $cat /etc/redhat-rele ...

  8. php 数组转xml 数组转json xml转数组 json转数组

    array->xml <?php function array2xml($array, $tag) { function ia2xml($array) { $xml="" ...

  9. SAM4E单片机之旅——9、UART与MCK之MAINCK

    为得到更高的带宽,需要使用更高的波特率.UART波特率的计算已经介绍过了,现在就尝试下调整外设的时钟频率.可以有多种方法调整外设时钟(MCK)的频率,这里先介绍先主要时钟(MAINCK)的设置,其中包 ...

  10. ios上视频与音乐合成后出现播放兼容问题的解决方法

    近期EasyDarwin开源流媒体团队EasyVideoRecorder小组同学Carl在支持一款短视频应用上线时,遇到一个问题:我们在IOS上合成"图片+音乐"成为视频之后,在P ...