一、创建数据库
在SQL Server Management Studio创建数据库 BloggingDatabase
在数据库BloggingDatabase创建Blogs表和 Posts 表。
CREATE TABLE [dbo].[Blogs] (
[BlogId] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (50) NULL,
[Url] NVARCHAR (250) NULL,
CONSTRAINT [PK_dbo.Blogs] PRIMARY KEY CLUSTERED ([BlogId] ASC)
);
CREATE TABLE [dbo].[Posts] (
[PostId] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (50) NULL,
[Content] NTEXT NULL,
[BlogId] INT NOT NULL,
CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED ([PostId] ASC),
CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blogs] ([BlogId]) ON
DELETE CASCADE
);
INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('CSDN 上传资源审核慢', 'https://csdn.s2.udesk.cn/im_client/')
INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('CSDN 网址是什么', 'https://www.csdn.net/')
二、新建实体数据模型
使用 Visual Studio 的 AOD.NET 实体框架工具来生成一些映射到数据库的代码。
选着来自数据库的 Code First 模式。
点击新建连接按钮创建数据库的连接,填写服务器地址、用户名和密码,接着选着BloggingDatabase数据库,然后点击下一步按钮。
点击箭头按钮,选着Blogs 和 Posts 表,点击完成按钮,此时节点名称为Bloggingcontext的数据库的连接字串会被自动添加到App.config 文件中。
App.config 文件新增的内容。
<connectionStrings>
<add name="Bloggingcontext" connectionString="data source=服务器地址;initial catalog=BloggingDatabase;user id=用户名;password=密码;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>
同时还添加了继承 DbContext 的Bloggingcontext 类,该类包含了两个带有 virtual 修饰的DbSet<Blogs> 类型的属性,这些属性分别对应数据库 BloggingDatabase 的 Blogs 和 Posts 表。
public Bloggingcontext() : base("name=Bloggingcontext") 通过数据库连接约定读取 App.config 中节点名称为 Bloggingcontext 连接数据库字符串。
派生上下文Bloggingcontext 类
public partial class Bloggingcontext : DbContext
{
public Bloggingcontext()
: base("name=Bloggingcontext")
{
}
public virtual DbSet<Blogs> Blogs { get; set; }
public virtual DbSet<Posts> Posts { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
模板类Blogs 和 Posts
此外,Blogs 和 Posts 类也添加到项目中,Blogs 类的 BlogId 字段添加了“[Key]”数据注释来指定BloggingDatabase 表 Blogs 的主键。Name 属性的 “[StringLength(250)]”指定表字段 Name 支持最大长度。Posts 导航属性的数据注释是自动生成的标识符。
Blogs类
public partial class Blogs
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Blogs()
{
Posts = new HashSet<Posts>();
}
[Key]
public int BlogId { get; set; }
[StringLength(50)]
public string Name { get; set; }
[StringLength(250)]
public string Url { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Posts> Posts { get; set; }
}
Posts类
public partial class Posts
{
[Key]
public int PostId { get; set; }
[StringLength(50)]
public string Title { get; set; }
[Column(TypeName = "ntext")]
public string Content { get; set; }
public int BlogId { get; set; }
public virtual Blogs Blogs { get; set; }
}
三、读取和写入数据
实现Program.cs 文件的 Main 方法中实现向Blog 表添加一条记录,并且使用LINQ 查询从Blog 表查找所有记录,最后遍历输出这些记录。
internal class Program
{
static void Main(string[] args)
{
using (var db = new Bloggingcontext())
{
// 创建和保存一个Blog实例
Console.Write("输入 Blog 的名称: ");
var name = Console.ReadLine();
var blog = new Blogs { Name = name };
db.Blogs.Add(blog);
db.SaveChanges();
// 遍历 Blog 所有记录
var query = from b in db.Blogs
orderby b.Name
select b;
foreach (var item in query)
{
Console.WriteLine(item.Name);
}
Console.ReadKey();
}
}
}
四、迁移
迁移功能能够以递增方式更新数据库架构,使其与应用程序的数据模型保持同步,同时保留数据库中的现有数据。
详细步骤可以参考《Entity Framework 6.0 Code First》的迁移章节。