在 Mac OS X 上创建的 .NET 命令行程序访问数据库 (使用Entity Framework 7 )

警告

您当前查看的页面是未经授权的转载!
如果当前版本排版错误,请前往查看最新版本:http://www.cnblogs.com/qin-nz/p/aspnet5-console-using-entity-framework-on-mac-os.html

提示

更新时间:2016年01月20日。

安装环境

首先,你需要安装 ASP.NET Core 1.0,没错,即使你只是想运行个命令行程序。

然后使用 brew 来安装 ICU (在coreclr下,需要这个来避免已知问题)

sudo brew install icu4c

安装 .NET 版本管理器(DNVM)

curl -sSL \
https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh \
| DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh

安装 .NET 运行环境(DNX),本文选择coreclr版的运行时

dnvm upgrade -r coreclr

如果安装有问题,请参考 在 Mac OS 上创建并运行 ASP.NET Core 1.0 网站 的第一部分

创建项目

这次我们手动创建一个项目,有关空项目需要包含的内容,可以参考 ASP.NET Core 1.0 入门——了解一个空项目

创建项目文件夹

mkdir ConsoleApp
cd ConsoleApp

注解

请务必将文件夹命名为 ConsoleApp ,或者你需要更改后面 project.jsonrun 命令。

创建项目 project.json

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"dependencies": {
"EntityFramework.Sqlite": "7.0.0-rc1-final",
"EntityFramework.Commands": "7.0.0-rc1-final",
"Microsoft.Extensions.PlatformAbstractions": "1.0.0-rc1-final",
"System.Linq": "4.0.1-beta-23516"
},
"commands": {
"run": "ConsoleApp",
"ef": "EntityFramework.Commands"
},
"frameworks": {
"dnxcore50": {
"dependencies": {
"System.Console": "4.0.0-beta-*"
}
}
}
}

第3,4行,我们引用了 Entity Framework 的 Sqlite 和 Commands ,Sqlite 用于访问本地的Sqlite数据库,而 Commands 帮我们进行代码到数据库设计的操作。

第8,9行,说明了我们可以使用 dnx 运行的命令;

当我们使用 dnx run 的时候,dnx 会找到名为 ConsoleApp 文件夹所包含的项目的 Main 函数来运行;

而当我们使用 dnx ef --help 的时候,dnx 运行 EntityFramework.Commands 并且把 --help 传递进去。

接下来还原 Nuget 包引用,也就是下载 dependencies 的内容。

dnu restore

创建程序入口点 Program.Main

在相同目录下创建 Program.cs ,添加如下内容:

using System;

namespace ConsoleApp
{
public class Program
{
public static void Main()
{
Console.WriteLine("Hello World!");
}
}
}

在 ConsoleApp 目录运行 dnx run 验证程序是否正确运行,运行 dnx ef 验证EF安装是否成功。

使用 EntityFramework 进行数据访问

添加 ModelDbContext

这里,我们需要创建 ModelDbContext 两种类型。

DbContext 实际上就是将数据库实例映射到 .NET 的一个对象,通过这个对象,可以访问到数据库的所有内容。

我们自己定义一个 BloggingContext 继承自 DbContext ,我们给这个数据库定义两张表 BlogsPosts
同时在代码中指定我们使用的是Sqlite数据库,并给出连接字符串。

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System.Collections.Generic;
using System.IO;
using Microsoft.Data.Entity;
using Microsoft.Extensions.PlatformAbstractions; namespace ConsoleApp
{
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var path = PlatformServices.Default.Application.ApplicationBasePath;
optionsBuilder.UseSqlite("Filename=" + Path.Combine(path, "blog.db"));
}
} }

将下面的代码插入到第19行。

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public string Name { get; set; } public List<Post> Posts { get; set; }
} public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; } public int BlogId { get; set; }
public Blog Blog { get; set; }
}

注意这里,第3,12行,都是以类名+Id来命名的;此时, EntityFramework 会把这个识别为主键, EntityFramework 必须有主键才能正常工作。

这段代码在执行数据库迁移后得到的两张表结构如下图:


第16-17行,进行了一个 Blog <–> Post 的一对多映射。

创建数据访问程序

将 Program.cs 修改为下面的样子,注意我添加了第二行:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Linq; namespace ConsoleApp
{
public class Program
{
public static void Main()
{
using (var db = new BloggingContext())
{
db.Blogs.Add(
new Blog
{
Name = "qin-nz",
Url = "http://cnblogs.com/qin-nz",
Posts = new[]
{
new Post{Title="post-1"},
new Post{Title="post-2"}
}.ToList()
}); var count = db.SaveChanges();
Console.WriteLine("{0} 条记录保存成功", count); Console.WriteLine("数据库中的记录如下");
foreach (var blog in db.Blogs)
{
Console.WriteLine($"{blog.Name}({blog.Url})");
if (blog.Posts != null)
{
foreach (var post in blog.Posts)
{
Console.WriteLine($" {post.Title}");
}
}
}
}
}
}
}

注解

BloggingContext 对象的操作并不会修改数据库,仅当使用 SaveChanges() 后才能同步到数据库中。

创建数据库

截至目前,我们只是完成了代码的编写,但是并没有创建一个可以访问的数据库。
下面,我们使用 dnx ef 根据代码生成数据库。

生成数据库创建脚本:

dnx ef migrations add MyFirstMigration

根据脚本创建(更新)数据库文件:

dnx ef database update

运行命令行程序

dnx run

如果项目没有错误,那么你应该看到下面的输出。

至此,你已经成功的在 Mac OSX 上运行了一个 .NET 的命令行程序, 并对本地的数据库进行了读写访问。

声明

在 Mac OS X 上创建的 .NET 命令行程序访问数据库 (使用Entity Framework 7 ) 由 勤奋的小孩 创作,采用 知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 http://space.cnblogs.com/msg/send/qin-nz 处获得。

在 Mac OS X 上创建的 .NET 命令行程序访问数据库 (使用Entity Framework 7 )的更多相关文章

  1. Mac OS X 中一些常用的命令行技巧

    一.网络设置相关 1.网卡的物理地址的动态重置 出于某些需求,例如网络中的 IP 地址或网络帐号与网卡物理地址绑定,使得多个设备无法切换上网,可尝试临时更改物理地址.不过,系统偏好设置是不能修改网卡物 ...

  2. Mac OS X 上启动 FTP/SFTP server,并设置 log level

    木易小伟的博客| 木易小伟的博客 2013-08-13 5708 阅读 FTP Log SFTP Mac OS 系统配置 1. 启动FTP Server: 命令行下,  sudo -s launch ...

  3. Mac OS X 上安装 ASP.NET 5

    在Mac OS X Yosemite 10.10.3 中搭建第一个 ASP.NET 5 Web 项目 终于有时间在 Mac 上安装一下 ASP.NET 5,网上有许多教程,但是多数的时间比较早了,版本 ...

  4. Mac OS X上用CoreCLR运行一个真正的.NET控制台程序

    这个真正的控制台程序来自corefxlab,名叫CoreClrHelloWorld,是一个跨平台的.NET控制台演示程序,可以显示微软.Linux.苹果的logo. CoreClrHelloWorld ...

  5. phpMyAdmin在Mac OS X上的配置和使用

    本文主要记录phpMyAdmin在Mac OS X上的配置和使用,避免朋友们走弯路,浪费不必要的时间.   1. 下载:    2. 在"设置"中打开" web shar ...

  6. Sqlite在Windows、Linux 和 Mac OS X 上的安装过程

    一:在 Windows 上安装 SQLite 1,下载 请访问SQLite下载页面http://www.sqlite.org/download.html,从Windows 区下载预编译的二进制文件.需 ...

  7. 在 Mac OS X 上安装 TensorFlow

    在 Mac OS X 上安装 TensorFlow 这个文档说明了如何在 Mac OS X 上安装 TensorFlow. 注意:从 1.2 版本开始,在 Mac OS X 上 TensorFlow ...

  8. Mac OS X上使用Wireshark抓包

    Wireshark针对UNIX Like系统的GUI发行版界面采用的是X Window(1987年更改X版本到X11).Mac OS X在Mountain Lion之后放弃X11,取而代之的是开源的X ...

  9. 如何在Mac OS X上安装 Ruby运行环境

    对于新入门的开发者,如何安装 Ruby和Ruby Gems 的运行环境可能会是个问题,本页主要介绍如何用一条靠谱的路子快速安装 Ruby 开发环境.此安装方法同样适用于产品环境! 系统需求 首先确定操 ...

随机推荐

  1. mysql - 其它

    1.mysql查看表字段和字段描述 SELECT column_name, column_comment FROM information_schema.columns WHERE table_sch ...

  2. Linux内核开机保留大块内存的方法

    http://www.linuxidc.com/Linux/2014-03/97952.htm

  3. location对象

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 使用Word发布文章到 WordPress 博客

    使用Word发布文章到 WordPress 博客 我们都知道,WordPress 自带的编辑器功能比较弱,而使用 Word 编辑文档却功能强大.其实我们使用 Word 编辑好的文档也是可以直接发布到 ...

  5. mysql分表和表分区详解

    为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能 ...

  6. 利用Service bus中的queue中转消息

    有需求就有对策就有市场. 由于公司global的policy,导致对公司外发邮件的service必须要绑定到固定的ip地址,所以别的程序需要调用发邮件程序时,问题就来了,如何在azure上跨servi ...

  7. 无法连接 MKS: Login(username/password)incorrect

    升级到Vmware Workstation 12之后,客户端能连上虚拟机服务器,但却打不开共享的虚拟机,提示报错"无法连接 MKS: Login(username/password)inco ...

  8. java_method_stringUtils

    /** * 字符串英文单双引号处理,将中英文引号转为中文的引号 * @param temp * @return */ public static String getStringDatabase(St ...

  9. 使用SVN同步资源后图标样式的详细解读

    项目视图   The Package Explorer view - 已忽略版本控制的文件.可以通过Window → Preferences → Team → Ignored Resources.来忽 ...

  10. Bootstrap插件系列——Bootstrap-table初始化、分页、客户端搜索、服务端搜索

    又好久不写博客,最近项目都是用的bootstrap的样式,不出意外,应该是要在bootstrap的道路上越走越远了,所以下定决心,把bootstrap的插件都好好学学. 昨天写了boostrap-ta ...