代码使用ASP.NET网页网站今天福彩字谜总汇

实体框架代码首先今天福彩字谜总汇使更改为模型通过代码传播到数据库。在引入今天福彩字谜总汇之前,模型的变化导致数据库正在从划痕与伴随的数据丢失。在开发期间,这可能不会引起太多问题,但是一旦数据库部署到生产中,它就是另一个故事。今天福彩字谜总汇解决该问题的问题在不丢失数据的情况下应用于数据库模式。

今天福彩字谜总汇不是新的。他们是实体框架故事的一部分 自2012年3月以来。它们实际上是基于 主动记录今天福彩字谜总汇 (Rails框架使用的主要数据访问技术) 大约一段时间更长。代码第一今天福彩字谜总汇不仅仅是ASP.NET的东西, 任何一个。它们可用于任何具有实体框架的项目。但 如果您是ASP.NET网页开发人员,则呈现问题。网页 使用该网站使用 网站 项目类型,没有被视为一个 Visual Studio项目。网页 应用 项目 - 创建的项目 Visual Studio中的新项目选项 - 具有.csproj或.vbproj文件,哪个 详细信息要包含在项目中的文件以及任何跨项目 references.  还有一些其他差异 对于那些感兴趣的人。

如果要使用ASP.NET网页网站使用今天福彩字谜总汇,则存在一个 解决方法:您可以将数据访问代码放在单独的类库中 项目。 WebMatrix不支持创建类库项目,但免费的Visual Studio Express for Web。这篇文章会看看建立的容易程度 您的数据层是使用代码首次今天福彩字谜总汇的单独组件 Studio Express 2013 Web预览。如果您使用的是,步骤将是相同的 the 2012 version.

我看过使用的 之前的实体框架在ASP.NET网页上,就像以前一样,这 示例应用程序将提供书籍和作者。 本文假设 您可以了解如何编写符合实体框架的方法 模型。如果您不确定,请先阅读上一篇文章。

一旦你有 下载的Visual Studio Express(如果您没有已经拥有它),第一步 是从新网站选项创建剃刀网站并命名它 BooksWithMigrations.

今天福彩字谜总汇1

这将导致基于入门站点模板的网站。出于本练习的目的,您将无法使用StarterSite数据库,因此更改Web.config文件中的连接字符串,以便名称为BookContext,数据库是Books.sdf:

<connectionStrings>
  <add name="BookContext" connectionString="Data Source=|DataDirectory|\Books.sdf" providerName="System.Data.SqlServerCe.4.0" />
</connectionStrings>

此外,注释_AppStart.cshtml文件中的第一行。您将不会在此项目中使用WebSecurity。

如果您在解决方案资源管理器中查看,您可以看到您目前在解决方案中有一个项目。

今天福彩字谜总汇

您即将添加另一个项目。转到文件»添加并选择新项目。选择C#类库作为项目类型,并将其命名为BookData。

今天福彩字谜总汇

接下来,打开包管理器控制台。如果 它不会显示为主窗口底部的标签,转到工具» Library包管理器»Package Manager控制台。当 下午 > 提示,类型

安装 - 包EntityFramework -ProjectName BooksData

这将将最新版本的实体框架安装到其中 基于您选择的.NET版本的BooksData项目。控制台消息将 告诉您已安装了哪个版本。目前,最新版本是 5,但在RC1的版本6中,这可能会恰当地更换。

轮到你了 可以写一些代码。删除在类库项目中自动生成的类1.CS文件。然后创建一个 文件夹称为实体。将一个名为book.cs的类文件添加到实体文件夹, 并用以下内容替换现有代码:

using System;
using System.ComponentModel.DataAnnotations;

命名空间 BooksData.Entities
{
    public class Book
    {
        public int BookId { get; set; }
        [MaxLength(200)]
        public string Title { get; set; }
        public string Description { get; set; }
        [MaxLength(20)]
        public string ISBN { get; set; }
        public DateTime DatePublished { get; set; }
        public int CategoryId { get; set; }
        public int AuthorId { get; set; }

        public virtual Category Category { get; set; }
        public virtual Author Author { get; set; }
    }
}

请注意,Visual Studio会自动生成一个 namespace 它采用FormsName.FolderName。命名空间简单 将相关代码分组在一起的方式。他们还定义了范围,以便 示例,您可以在项目中使用相同的名称为两个不同的类(如果 你真的需要),只要它们在不同的名称空间中即可。完全 命名空间中的类的限定名称采用表单 projectname.foldername.classname。你会看见 很快影响名称空间是什么。与此同时,您还需要 作者和类别的课程:

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

命名空间 BooksData.Entities
{
    public class Author
    {
        public int AuthorId { get; set; }
        [MaxLength(35)]
        public string FirstName { get; set; }
        [MaxLength(35)]
        public string LastName { get; set; }
        public string Biography { get; set; }
        public virtual ICollection<Book> Books { get; set; }
    }
}

 

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

命名空间 BooksData.Entities
{
    public class Category
    {
        public int CategoryId { get; set; }
        [MaxLength(50)]
        public string CategoryName { get; set; }
        public virtual ICollection<Book> Books { get; set; }
    }
}

所需的最终实体是上下文。此类继承自DBContext 并作为实体框架后面的发动机:

using System.Data.Entity;

命名空间 BooksData.Entities
{
    public class BookContext : DbContext
    {
        public DbSet<Book> Books { get; set; }
        public DbSet<Author> Authors { get; set; }
        public DbSet<Category> Categories { get; set; }
    }
}

现在上下文存在,您可以启用今天福彩字谜总汇。你简单地这样做 typing

启用 - 今天福彩字谜总汇-projectname booksdata

下午 > 在Package Manager控制台中提示。 完成后,您应该确认代码首次今天福彩字谜总汇 已启用项目书籍数据。

今天福彩字谜总汇

生成一个名为今天福彩字谜总汇的新文件夹,并在该文件夹中有一个 文件:configuration.cs。

今天福彩字谜总汇

配置类由设置的构造函数组成 自动代码可信 错误的 A. 种子 方法。这 种子 每次运行今天福彩字谜总汇时都执行方法,并且是完美的 使用一些种子数据填充数据库的位置:

命名空间 BooksData.Migrations
{
    using BooksData.Entities;
    using System;
    using System.Collections.Generic;
    using System.Data.Entity.Migrations;

    internal sealed class Configuration : dbmigration.sConfiguration<BookContext>
    {
        public Configuration() {
            自动代码可信 = 错误的;
        }

        protected override void 种子(BookContext context) {
            var categories = new List<Category>{
                new Category{CategoryName = "ASP.NET"},
                new Category{CategoryName = "JavaScript"},
                new Category{CategoryName = "HTML5"}
            };

            categories.ForEach(category => context.Categories.AddOrUpdate(c => c.CategoryName, category));
            context.SaveChanges();

            var authors = new List<Author>{
                new Author{FirstName = "Mike", LastName = "Brind"},
                new Author{FirstName = "Imar", LastName = "Spaanjaars"}
            };

            authors.ForEach(author => context.Authors.AddOrUpdate(a => a.LastName, author));
            context.SaveChanges();

            var book = new Book {
                Title = "Beginning ASP.NET Web Pages With WebMatrix",
                Description = "Buy this book!",
                ISBN = "978-1118050484",
                DatePublished = new DateTime(2011, 10, 18),
                AuthorId = 1,
                CategoryId = 1
            };

            context.Books.AddOrUpdate(b => b.ISBN, book);
            context.SaveChanges();
        }
    }
}

我整理了一下 - 我已经包括使用了 指令在顶部为BooksData.entities命名空间。这让我 参考实体名称不必使用完全限定的名称。注意 the code uses the addorupdate. 方法。这可确保数据行不是 通过后续今天福彩字谜总汇执行种子方法时复制。它 确保传递给第一个参数的值在表中是唯一的。 例如,如果找到具有“brind”的LastName值的行,则不额外 数据插入作者表中。这 addorupdate. 方法仅供参考 种子 方法。

您几乎准备好运行第一个今天福彩字谜总汇,这将创建 数据库并使用种子数据填充它。但是,您需要定义 数据库的位置。您在生成的项目的app.config文件中执行此操作 安装实体框架包时。您需要指定一个连接字符串,您可以通过添加可以执行 在EntityFramework部分之后:

  <connectionStrings>
    <add name="BookContext" 
         connectionString="Data Source=Path_To_Database\Books.sdf" 
         providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>

连接字符串的名称必须与上下文中的名称匹配 案例,BookContext。在上面的“path_to_database”中需要替换为 要创建数据库的位置的完整文件系统路径,它应该是网站项目的App_Data文件夹。

现在你几乎准备好了。转到包管理器控制台 并在提示符下键入:

Add-Migration IniterCreate -ProjectName BooksData

然后点击进入。假设一切顺利,文件被添加到今天福彩字谜总汇文件夹中。这是名字是一个 日期邮票的组合和您刚刚给予今天福彩字谜总汇的名称。它 inherits from dbmigration. 并包含两种方法:UP 和下来。 UP方法包括用于生成表和列的代码 根据您之前编码的实体。 DOWN方法反转变化 由上来创造。每个今天福彩字谜总汇包括两种方法,以便您可以反转 如果需要进行更改。现在是时候运行第一次今天福彩字谜总汇来创建 database. 在Package Manager控制台中键入以下内容:

更新 - 数据库-ProjectName BooksData

如果检查您网站的App_Data文件夹,您将看到该图书.sdf 已经被创造了。很遗憾。 VS 2013 Express预览版不包括 能够查看SQL CE文件的内容,因此您必须恢复到 webmatrix。如果在创建网站而不是razor 2时选择了razor 3选项,webmatrix不会打开网站(此刻 - 当剃刀3正式启动时,这应该改变),所以如果你想要 检查数据库内容,您必须将其复制到新创建的空 Site.

如果要打开数据库,可以看到已创建的表 您的实体和种子数据已插入。此外,一个叫做的表 已生成_migrationHistory以跟踪今天福彩字谜总汇。

今天福彩字谜总汇4.

今天福彩字谜总汇点不是创建初始数据库 - 它是将通过代码今天福彩字谜总汇到数据库的模型的更改。所以下一步将检查如何管理。更新书籍数据中的书籍实体项目,以包括名为Price设置为十进制数据类型的属性:

using System;
using System.ComponentModel.DataAnnotations;

命名空间 BooksData.Entities
{
    public class Book
    {
        public int BookId { get; set; }
        [MaxLength(200)]
        public string Title { get; set; }
        public string Description { get; set; }
        [MaxLength(20)]
        public string ISBN { get; set; }
        public DateTime DatePublished { get; set; }
        public decimal Price { get; set; }
        public int CategoryId { get; set; }
        public int AuthorId { get; set; }

        public virtual Category Category { get; set; }
        public virtual Author Author { get; set; }
    }
}

然后在Package Manager控制台提示符下键入以下内容:

Add-MigrationAddPrice -ProjectName BooksData

按Enter键后,今天福彩字谜总汇代码将在新文件中生成。 UP方法包含单个指令,用于使用十进制数据类型添加名为Play的列,向图表表添加到Books表中,Down方法包含代码以反转该更改。将更改传播到数据库,键入

更新 - 数据库-ProjectName BooksData

在提示并按Enter键。今天福彩字谜总汇运行后,您可以在数据库中看到“图书”表中的新列。

今天福彩字谜总汇5

现在唯一缺少的是将数据退出数据库的方法。将一个新文件夹添加到名为储存库的BooksData类库,并将类添加到该文件夹​​名为CategorLepository。类文件的完整代码如下:

using BooksData.Entities;
using System;
using System.Collections.Generic;
using System.Linq;

命名空间 BooksData.Repositories
{
    public class CategoryRepository : IDisposable
    {
        private BookContext _context = new BookContext();
        private bool _disposed;

        public IEnumerable<Category> GetCategories() {
            return _context.Categories.ToList();
        }

        protected virtual void Dispose(bool disposing) {
            if (!_disposed) {
                if (disposing && _context != null) {
                    _context.Dispose();
                }
            }
            _disposed = true;
        }

        public void Dispose() {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    }
}

类别repository实现可执行的,只有两种公共方法;一个返回类别对象的集合,另一个返回另一个类别,确保正确处理书籍,以防止由于太多的开放数据库连接等内存泄漏等等。更多的那个稍后。这是一个书包,具有更广泛的常用数据访问方法:

using BooksData.Entities;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;

命名空间 BooksData.Repositories
{
    public class BookRepository : IDisposable
    {
        private BookContext _context = new BookContext();
        private bool _disposed;

        public int Save(Book book) {
            if (book.BookId.Equals(0)) {
                _context.Books.Add(book);
            }
            else {
                _context.Entry(book).State = EntityState.Modified;
            }
            return _context.SaveChanges();
        }

        public int Delete(int id) {
            var book = new Book { BookId = id };
            _context.Entry(book).State = EntityState.Deleted;
            return _context.SaveChanges();
        }

        public Book Find(int id) {
            return _context.Books.First(b => b.BookId.Equals(id));
        }

        public IEnumerable<Book> GetBooks() {
            return _context.Books.AsNoTracking().ToList();
        }

        public IEnumerable<Book> GetBooksByCategory(int categoryId) {
            return _context.Books.Include("Author").Include("Category").Where(b => b.CategoryId.Equals(categoryId)).ToList();
        }

        protected virtual void Dispose(bool disposing) {
            if (!_disposed) {
                if (disposing && _context != null) {
                    _context.Dispose();
                }
            }
            _disposed = true;
        }

        public void Dispose() {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    }
}

接下来,从网站添加对BooksData项目的引用。单击解决方案资源管理器中的网站名称以选择它,然后右键单击并选择“添加参考”,或转到“网站”菜单,然后选择“添加引用”。在对话框中,选择“解决方案”,然后选择“书籍数据”项目。

今天福彩字谜总汇

当解决方案最终构建时,这将导致添加到网站的Bin文件夹中的书籍数据组件(DLL文件)。但是,BooksData组件的元素可用于网站,用于直接编码目的。要保存要键入实体或存储库的完全限定名称,请在Default.cshtml顶部添加几个使用指令。 IntelliSense可以看到组件:

今天福彩字谜总汇9

以下是一个示例页面,其中包含类别的下拉列表,然后返回属于所选类别的所有书籍。如果您正在使用种子数据,只有ASP.NET类别将返回任何书籍:

@using BooksData.Entities;
@using BooksData.Repositories;
@{
    Layout = "~/_SiteLayout.cshtml";
    Page.Title = "Books With Migrations";
    
    var categories = Enumerable.Empty<SelectListItem>();
    var books = Enumerable.Empty<Book>();
    using (var repository = new CategoryRepository()) {
        categories = repository.GetCategories().Select(c => new SelectListItem {
            Value = c.CategoryId.ToString(),
            Text = c.CategoryName,
            Selected = c.CategoryId == Request["categoryId"].AsInt()
        });
    }

    if (IsPost && Request["categoryId"].IsInt()) {
        using (var repository = new BookRepository()) {
            books = repository.GetBooksByCategory(Request["categoryId"].AsInt());
        }
    }
}

@section featured {
<section class="featured">
    <div class="content-wrapper">
        <hgroup class="title">
            <h1>@Page.Title.</h1>
        </hgroup>
    </div>
</section>
}

<h3>Books</h3>

<form method="post">
    <fieldset>
        <legend>Select Category</legend>
        <div>@Html.DropDownList("categoryId", " --Select Category-- ", categories)</div>
        <button>Select</button>
    </fieldset>
</form>
@if (books.Any()) {
    foreach (var book in books) {
        <div>
            <h3>@book.Title</h3>
            Description: @book.Description<br />
            ISBN: @book.ISBN<br />
            Publication Date: @book.DatePublished.ToLongDateString()<br />
            Author: @book.Author.FirstName @book.Author.LastName<br />
            Category: @book.Category.CategoryName
        </div>
    }
}

请注意,存储库在使用时实例化 陈述。这些与使用不同 指令。指令将命名空间带入范围,而使用语句可确保正确使用实现可执行的对象。要实现IDispoSable,该对象必须提供一个名为Dispose()的方法,该方法应该发布"unmanaged resources"(即.NET Framework无法控制的那些,例如与数据库的连接)。如果您调用,则存储库实现可执行的。包括Dispose方法,可确保在不再需要存储库时配置上下文(DBContexts实现IDisposable)。当使用语句到达其关闭支架时,它在其内实例化的对象将以正确的方式调用其进行处理。

最后,右键单击解决方案资源管理器中的解决方案名称,然后选择“构建解决方案”,或者只是按SHIFT + CTRL + B.假设这两个项目都构建成功,BooksData.dll和EntityFrameWork.dll文件将已复制到Bin文件夹网站,它已准备好发布。

今天福彩字谜总汇10.

今天福彩字谜总汇是代码首次开发的一个非常有帮助的补充,这篇文章看起来如何利用它们作为网页开发人员。

源代码 BooksData类库 在github上可用的是 样本网站 这是利用它。