作为一名.NET开发者,原本必须使用Windows操作系统进行开发。但是随着.NET Core的发布,得以在不同的操作系统上进行开发。最初,遇到了一些问题,但随着时间的推移,逐渐解决了这些问题,现在可以使用Visual Studio Mac进行开发。本系列文章共三篇,将逐步展示如何在Mac OS上使用Visual Studio for Mac和Visual Studio Code创建.NET CoreMVC项目,连接到AWS RDS数据库,并使用Entity Framework创建数据库和应用程序之间的连接。
首先,需要创建一个简单的MVC项目。为此,请打开Visual Studio并创建一个新项目(图1)。接下来,选择.NET Core3.1作为目标框架。
(图1 - 创建新的MVC项目)
也许这会让感到惊讶,但在这里将看到一个完全空白的窗口,但不用担心,这只是因为解决方案资源管理器被关闭了。查看-布局-解决方案资源管理器。在这里,就像在Visual Studio Windows中一样,在MVC项目中有:
接下来,需要连接服务以运行应用程序。由于将使用Entity Framework与数据库进行通信,因此需要连接与它相关的一切。图2显示了连接服务的示例。
(图2 - 连接服务)
将创建一个名为Hospitals的模型。在模型文件夹中创建一个新类。它将包含以下代码:
public class Hospital
{
[Key]
public int HospitalId { get; set; }
[StringLength(100)]
[Display(Name = "Hospital Name")]
public string HospitalName { get; set; }
[Required]
[StringLength(100)]
[Display(Name = "Decision Maker")]
public string DecisionMaker { get; set; }
[Required]
[StringLength(100)]
[Display(Name = "Email")]
public string Email { get; set; }
[Required]
[StringLength(100)]
[Display(Name = "Phone")]
public string Phone { get; set; }
}
转到解决方案资源管理器并创建一个名为Data的文件夹,然后创建一个空类。它应该看起来像图3。
(图3 - 创建DBContext类)
为了将应用程序与数据库连接起来,需要在DBContext类中添加以下代码:创建一个从DbContext继承的类。
public class DBContext : DbContext
{
public DbSet Hospitals { get; set; }
}
接下来,需要定义一个表,创建模型时将与之建立连接。很多人不使用它,但使用它,因为在经验中,有很多情况下模型类名与数据库中的名称不同。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity().ToTable("Hospitals");
}
然后,将指示数据库的位置,目前先这样设置,稍后在下一步中再回来这里。
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlServer("");
让创建一个静态方法,它将返回一个新的上下文给。
public static DBContext Create()
{
return new DBContext();
}
结果,应该得到以下代码:
public class DBContext : DbContext
{
public DbSet Hospitals { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity().ToTable("Hospitals");
}
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlServer("");
}
接下来,需要创建三个方法:显示表中的所有记录,向表中添加新记录,以及创建一个空页面来填充模型。由于本文的目的是展示操作的基本原理,不再展示它。
让创建一个新的控制器并将其命名为HospitalsController(图4)。
(图4 - 创建新控制器)
接下来,让继承类Controller类。
public class HospitalsController : Controller
{
private DBContext _context;
public HospitalsController()
{
_context = new DBContext();
}
protected override void Dispose(bool disposing) => _context.Dispose();
}
接下来,让创建三个方法。第一个方法将显示实体列表。在这段代码中,从数据库中读取值并将它们返回到稍后将创建的视图中(Index, Save, New)。添加以下代码:
[Route("Hospitals/Index")]
public ActionResult Index()
{
var HospitalsList = _context.Hospitals;
return View("Index", HospitalsList);
}
接下来,创建第二个方法将创建一个新的实体。添加以下代码:
public ActionResult New()
{
var hospital = new Hospital();
return View("HospitalsForm", hospital);
}
接下来,创建第三个方法将保存一个新的实体。让添加以下代码:
public ActionResult Save(Hospital hospital)
{
if (!ModelState.IsValid)
{
var _hospital = hospital;
return View("CustomerForm", hospital);
}
_context.Hospitals.Add(hospital);
_context.SaveChanges();
return RedirectToAction("Index", "Hospitals");
}
最后,需要做的是将视图添加到应用程序中。
接下来,让编辑Shared文件夹中的_Layout。
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Hospitals" asp-action="Index">
Hospitals
</a>
</li>
对于例子,用两个视图。Visual Studio for Mac没有标准功能,可以立即创建一个视图而不需要连接各种扩展(图5)。
(图5 - 不能从控制器创建视图)
要创建这个,转到视图选项卡并创建一个名为Hospitals的新文件夹。接下来,创建两个视图文件 - Index, HospitalsForm。它将向显示一个列表,并且还会有一个创建新实体的按钮。
将以下代码添加到Index:
@model IEnumerable<My_Code_first.Models.Hospital>
@{ ViewBag.Title = "Hospitals"; Layout = "~/Views/Shared/_Layout.cshtml"; }
<h2>
Customers
</h2>
<p>
@Html.ActionLink("New Hospital", "New", "Hospitals", null, new { @class = "btn btn-primary" })
</p>
<table class="table">
<tr>
<th>
Hospital ID
</th>
<th>
Hospital Name
</th>
<th>
Decisionmaker
</th>
<th>
Phone
</th>
<th>
Email
</th>
</tr>
@foreach (var hospital in Model)
{
<tr>
<td>
@Html.DisplayFor(hospitalId => hospital.Hospitalid)
</td>
<td>
@Html.DisplayFor(hospitalName => hospital.HospitalName)
</td>
<td>
@Html.DisplayFor(hospitalDicisionmaker => hospital.Dicisionmaker)
</td>
<td>
@Html.DisplayFor(hospitalPhone => hospital.Phone)
</td>
<td>
@Html.DisplayFor(hospitalEmail => hospital.Email)
</td>
</tr>
}
</table>
接下来,代码在HospitalForm中。
@model My_Code_first.Models.Hospital
@using (Html.BeginForm("Save", "Hospitals"))
{
@Html.ValidationSummary()
<div class="form-group">
@Html.LabelFor(m => m.HospitalName)
@Html.TextBoxFor(m => m.HospitalName, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.HospitalName)
</div>
<div class="form-group">
@Html.LabelFor(m => m.Dicisionmaker)
@Html.TextBoxFor(m => m.Dicisionmaker, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Dicisionmaker)
</div>
<div class="form-group">
@Html.LabelFor(m => m.Email)
@Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Email)
</div>
<div class="form-group">
@Html.LabelFor(m => m.Phone)
@Html.TextBoxFor(m => m.Phone, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Phone)
</div>
<button type="submit" class="btn btn-primary">
Save
</button>
@Html.HiddenFor(m => m.Hospitalid)
@Html.AntiForgeryToken()
}
对于这一步,已经完成了。