通过现有数据库在 .NET Framework 上开始使用 EF Core

微软官方案例 在本教程中,你将构建一个控制台应用程序,它使用 Entity Framework 对 Microsoft SQL Server 数据库执行基本数据访问。 通过对现有数据库进行反向工程,创建 Entity Framework 模型。 在 GitHub 上查看此文章的示例。 系统必备 Visual Studio 2017 版本 15.7 或更高版本 创建博客数据库 本教程使用 LocalDb 实例上的博客数据库作为现有数据库。 如果已在其他教程中创建了博客数据库,请跳过这些步骤。 打开 Visual Studio “工具”->“连接到数据库…” 选择“Microsoft SQL Server”,然后单击“继续” 输入“(localdb)\mssqllocaldb”作为服务器名称 输入“master”作为数据库名称,然后单击“确定” Master 数据库现在显示在“服务器资源管理器”的“数据连接”中 右键单击“服务器资源管理器”中的数据库,然后选择“新建查询” 将下列脚本复制到查询编辑器中 右键单击查询编辑器,然后选择“执行” SQL复制 创建新项目 打开 Visual Studio 2017 “文件”>“新建”>“项目…” 从左侧菜单中选择“已安装”>“Visual C#”->“Windows Desktop” 选择“控制台应用(.NET Framework)”项目模板 确保项目面向 .NET Framework 4.6.1 或更高版本 …

ASP.NET MVC(HelperMethods)

帮助函数封装一些代码,方便我们在应用程序中重用,MVC内建很多帮助函数,可以很方便的生成HTML标记。首先列出后面示例中用到的数据模型类定义: namespace HelperMethods.Models { public partial class Person { public int PersonId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public DateTime BirthDate { get; set; } public Address HomeAddress { get; set; } public bool IsApproved { get; set; } public Role Role { …

ASP.NET MVC(View)

视图引擎与视图 多数情况下控制器action方法返回ViewResult对象,MVC内建action调用器ControllerActionInvoker负责调用控制器action方法并调用视图引擎处理ViewResut,由视图引擎将ViewResult转化为ViewEngineResult对象,ViewEngineResult对象内含实现IView接口的视图对象,最终MVC框架调用视图对象的Render的方法渲染输出结果。下面还是以例子来演示这个过程,先来看看相关接口和类的定义与实现: public interface IViewEngine {   ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache);   ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache);   void ReleaseView(ControllerContext controllerContext, IView view); } public interface IView {   void Render(ViewContext viewContext, TextWriter writer); } public class ViewEngineResult {   public ViewEngineResult(IEnumerable<string> searchedLocations) {     if (searchedLocations == null) {       throw new ArgumentNullException(“searchedLocations”);     } …

ASP.NET MVC(Factory)

MVC的标准流程是请求传递给控制器,由控制器action方法操作数据模型,最后交由视图渲染输出,这里忽略了两个细节,就是MVC是如何创建相应控制器实例,又是如何调用控制器action方法的,这就必须讲到控制器工厂和action调用器。 控制器工厂 Controller factory负责创建并初始化控制器,控制器工厂实现IControllerFactory接口: namespace System.Web.Mvc { public interface IControllerFactory {   IController CreateController(RequestContext requestContext, string controllerName);   SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName);   void ReleaseController(IController controller);   } } 我们可以从IControllerFactory接口实现自定义的控制器工厂: public class CustomControllerFactory: IControllerFactory { public IController CreateController(RequestContext requestContext, string controllerName) { Type targetType = null; switch (controllerName) { case “Product”: targetType = typeof(ProductController); break; case “Customer”: targetType …

ASP.NET MVC(Action Filter)

public class AdminController : Controller { // … instance variables and constructor public ViewResult Index() { if (!Request.IsAuthenticated) { FormsAuthentication.RedirectToLoginPage(); } // …rest of action method } public ViewResult Create() { if (!Request.IsAuthenticated) { FormsAuthentication.RedirectToLoginPage(); } // …rest of action method } … AdminController控制器的众多Action中我们都需要判定当前验证用户,这里有很多重复的代码,我们可以简化为: [Authorize] public class AdminController : Controller { // … instance variables …

ASP.NET MVC(Controller)

MVC中控制器负责处理请求,由它操作数据模型,最后返回视图给用户。 IController接口 所有的控制器类以Controller结尾,必须实现System.Web.Mvc.IController接口,一个最简单的控制器类可以是: public class BasicController : IController { public void Execute(RequestContext requestContext) { string controller = (string)requestContext.RouteData.Values[“controller”]; string action = (string)requestContext.RouteData.Values[“action”]; if (action.ToLower() == “redirect”) { requestContext.HttpContext.Response.Redirect(“/Derived/Index”); } else { requestContext.HttpContext.Response.Write( string.Format(“Controller: {0}, Action: {1}”, controller, action)); } } } BasicController类实现了IController的唯一方法Execute(),在上面的例子中直接返回数据到请求响应,我们可以根据自己的需求来灵活的处理客户请求。 Controller类 更多的时候我们直接继承MVC已经定义的控制类System.Web.Mvc.Controller: public class DerivedController : Controller { public ActionResult Index() { ViewBag.Message …

ASP.NET MVC(MAPPING)

正如ASP.NET MVC名字所揭示的一样,是以模型-视图-控制设计模式构建在ASP.NET基础之上的WEB应用程序,我们需要创建相应的程序类来协调处理,完成从客户端请求到结果相应的整个过程: VS2012中一个典型的MVC工程结构是这样的: Controllers文件夹下存放控制类,Models文件下是业务数据模型类,Views文件下则是类似于aspx的视图文件。在传统ASP.NET form的应用程序中,客户端的请求最后都映射到磁盘上对应路径的一个aspx的页面文件,而MVC程序中所有的网络请求映射到控制类的某一个方法,我们就从控制类说起,而在讲控制类前,必须要讲的是URL路由。 注册URL路由 我们在浏览器中请求链接 http://mysite.com/Home/Index,MVC认为是这样的URL模式(默认路径映射): {controller}/{action} 也就是说上面的请求会被映射到Home控制类的Index方法,MVC命名规则中控制类必须以Controller结尾,所以Home控制类应该是HomeController:  public class HomeController : Controller { public ActionResult Index() { return View(); } }  MVC是根据什么将上面的请求映射到控制类的相应方法的呢?答案就是路由表,Global.asax在应用程序启动时会调用路由配置类来注册路径映射: public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } } 路径映射的配置类则在App_Start目录下: public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”); routes.MapRoute( name: …