设为首页 收藏本站
查看: 1716|回复: 0

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

[复制链接]

尚未签到

发表于 2015-12-29 12:51:58 | 显示全部楼层 |阅读模式
在 Mac OS X 上创建的 .NET 命令行程序访问数据库 (使用Entity Framework 7 )¶

提示
本文更新时间:2015年12月15日.




安装环境¶
  首先,你需要安装 ASP.NET 5,没错,即使你只是想运行个命令行程序。
  然后使用 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 5 网站 的第一部分



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



创建项目文件夹¶



mkdir ConsoleApp
cd ConsoleApp



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



创建项目 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 进行数据访问¶



添加  Model 和 DbContext¶
  这里,我们需要创建 Model 和 DbContext 两种类型。
  DbContext 实际上就是将数据库实例映射到 .NET 的一个对象,通过这个对象,可以访问到数据库的所有内容。
  我们自己定义一个 BloggingContext 继承自 DbContext ,我们给这个数据库定义两张表 Blogs 和 Posts 。
同时在代码中指定我们使用的是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(&quot;Filename=&quot; + Path.Combine(path, &quot;blog.db&quot;));
}
}
}

  将下面的代码插入到第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 <&#8211;> 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 = &quot;qin-nz&quot;,
Url = &quot;http://cnblogs.com/qin-nz&quot;,
Posts = new[]
{
new Post{Title=&quot;post-1&quot;},
new Post{Title=&quot;post-2&quot;}
}.ToList()
});
                var count = db.SaveChanges();
                Console.WriteLine(&quot;{0} 条记录保存成功&quot;, count);
Console.WriteLine(&quot;数据库中的记录如下&quot;);
foreach (var blog in db.Blogs)
{
Console.WriteLine($&quot;{blog.Name}({blog.Url})&quot;);
if (blog.Posts != null)
{
foreach (var post in blog.Posts)
{
Console.WriteLine($&quot;    {post.Title}&quot;);
}
}
}
}
}
}
}




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



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



dnx ef migrations add MyFirstMigration
  根据脚本创建(更新)数据库文件:



dnx ef database update



运行命令行程序¶



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

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



后续步骤¶
  在 Mac OS 上创建并运行 ASP.NET 5 网站

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-157976-1-1.html 上篇帖子: Mac OS X —— Think different. 下篇帖子: Mac OS X 10.10(yosemite)更新后,cocoapods出错, 及cocoapods更新至0.34后, 错误情况整理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表