使用ADO.NET Entity Framework 4.1进行Code First模式的开发

 

.NET的实体框架越来越完善了,前几天看到Entity Framework 4.1已经正式发布了,新添加了一种称为Code First的开发模式。字面上的意思就是代码优先;按照微软对于它的说明就是:Code First聚焦于定义你的model类,这些类可以映射到一个现有的数据库,或者根据这些类生成数据库,并且提供了数据注解功能和一个易用的API。

下面将对如何使用这种开发模式做一个简单的说明:

准备:您需要已经安装VS2010以及Entity Framework 4.1

1、新建项目或网站

无论是网站,还是项目都可以使用Code First的开发模式。

2、添加类库引用

  • EntityFramework
  • System.Data.Entity
  • System.ComponentModel.DataAnnotations

3、编写Model类

如果是网站需要把代码写到App_Code文件夹下才能够被编译执行。

public class Category
{
    [StringLength(50)]
    [Column(TypeName = "varchar")]
    public string CategoryId { getset; }
 
    [StringLength(20)]
    [Column("CategoryName", TypeName = "nvarchar")]
    public string Name { getset; }
 
    public virtual ICollection<Product> Products { getset; }
}
 
public class Product
{
    [Key]
    public int ProductId { getset; }
 
    [StringLength(100)]
    [Column("ProductName", TypeName = "nvarchar")]
    public string Name { getset; }
 
    [StringLength(50)]
    public string CategoryId { getset; }
 
    public virtual Category Category { getset; }
}
 
public class Supplier
{
    [Key]
    [StringLength(36)]
    public string SupplierCode { getset; }
 
    [StringLength(100)]
    [Column("SupplierName", TypeName = "nvarchar")]
    public string Name { getset; }
 
    public DateTime AddTime { getset; }
}

这些Model类和我们平常用的没什么两样,不需要任何基类,只不过增加了一些属性注解来做持久化映射。

这些属性定义在System.ComponentModel.DataAnnotations中,比如:Column用于映射数据表中的字段(字段名、字段类型等)。

如果我们不添加这些映射,则框架会按照惯例进行相关的映射处理,开发者不需要做什么显示配置。

关于这些属性可以参考:http://msdn.microsoft.com/en-us/library/dd901590(v=vs.95).aspx

EF4.1中支持的包括如下属性:

  • KeyAttribute  主键
  • StringLengthAttribute  字符串长度
  • MaxLengthAttribute 最大长度
  • ConcurrencyCheckAttribute
  • RequiredAttribute  必需
  • TimestampAttribute 时间戳
  • ComplexTypeAttribute 复合类型
  • ColumnAttribute  映射列:column name, ordinal & data type
  • TableAttribute 映射表:name 和schema
  • InversePropertyAttribute
  • ForeignKeyAttribute 外键
  • DatabaseGeneratedAttribute
  • NotMappedAttribute 在数据库中排除

4、创建DbContext

继承DbContext,为上边创建的Model添加数据集。

public class ProductContext : DbContext
{
    public DbSet<Category> Categories { getset; }
    public DbSet<Product> Products { getset; }
    public DbSet<Supplier> Suppliers { getset; }
}

这可以理解成一个数据操作类,而且DbContext提供了一些方法很不错,如Find可以根据主键查找数据。

5、添加数据库连接字符串

<connectionStrings>
        <add
          name="ProductContext"
          providerName="System.Data.SqlClient"
          connectionString="Server=192.168.100.100;Database=ProductContext;User ID=sa;Password=sa;Trusted_Connection=False;Persist Security Info=True "/>
    </connectionStrings>

注意这个数据连接的名称要和继承自DbContext的类的名称一致,数据库ProductContext在SQLServer中尚未创建。

6、编写数据处理

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        1、添加数据<br />
        Category Name:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
        <br />
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="添 加" />
        <br />
        <br />
         2、查询数据<br />
        <br />
        <asp:Button ID="Button2" runat="server" Text="查 询" OnClick="Button2_Click" />
        <br />
        <asp:Repeater ID="Repeater1" runat="server">
            <ItemTemplate>
                <%# Eval("CategoryId") %>&nbsp;&nbsp;<%# Eval("Name") %><br />
            </ItemTemplate>
        </asp:Repeater>
    </div>
    </form>
</body>
</html>
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.Entity;
using System.Collections;
 
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
 
    }
 
    protected void Button1_Click(object sender, EventArgs e)
    {
        using (ProductContext db = new ProductContext())
        {
            Category c = new Category()
            {
                CategoryId = Guid.NewGuid().ToString(),
                Name = TextBox1.Text
            };
 
            db.Categories.Add(c);
            db.SaveChanges();
        }
    }
 
    protected void Button2_Click(object sender, EventArgs e)
    {
        using (ProductContext db = new ProductContext())
        {
            IQueryable<Category> rs = from c in db.Categories
                                      select c;
 
            Repeater1.DataSource = rs.ToList();
            Repeater1.DataBind();
        }
    }
}

有两个数据操作,添加数据和查询数据。

在执行数据操作的时候, 如果数据库不存在则程序首先创建数据库,再进行数据操作。默认的情况下,如果数据库已经存在,则不执行更新数据库结构的操作。

但是我们有时候更改了Model类,希望能够同步到数据库中。

完美的实现方式就是我们改了某个字段或者某个表,数据库中只更新相应的部分就行了。但是这一想法没有在这个版本中实现。

微软提供的是如果发现Model类有变化,则重新创建数据库。微软的方法无疑会将我们的测试数据清理掉,还好我们可以在初始化的过程中添加测试数据,这样每次重新创建数据库的时候,测试数据就会自动加进去了,算是解决了一些问题。

public class ProductContextInitializer : DropCreateDatabaseIfModelChanges<ProductContext>
{
    protected override void Seed(ProductContext context)
    {
        //执行SQL语句创建数据
        //context.Database.ExecuteSqlCommand(File.ReadAllText("AddData.sql"));
 
        //或者也可以在这里操作实体对象添加数据
        context.Categories.Add(new Category() { CategoryId = Guid.NewGuid().ToString(), Name = "Category1" });
        context.Categories.Add(new Category() { CategoryId = Guid.NewGuid().ToString(), Name = "Category2" });
        context.SaveChanges();
    }
}

因为Code First是一种开发模式,也就是开发的过程,所以测试数据对于开发者来说并不是太重要,微软的解决方案可以接受。只不过实际运作起来就不能这样改了,只能手动改数据库了。

7、上边提到的微软的解决方案还需要通过一个方法开启:

创建文件Global.asax,在Application_Start中添加一个初始化操作:

void Application_Start(object sender, EventArgs e)
    {
        //在应用程序启动时运行的代码
        System.Data.Entity.Database.SetInitializer<ProductContext>(newProductContextInitializer());
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
.NET Entity Framework(EF)是微软提供的一种对象关系映射(ORM)框架,用于简化和加速开发者与数据库之间的交互。它允许开发使用面向对象的方式来操作数据库,而无需直接编写SQL语句。以下是一些与.NET Entity Framework相关的基本知识: 1. 什么是.NET Entity Framework? .NET Entity Framework是一个开源的ORM框架,它允许开发者通过定义实体类和关系来操作数据库。它提供了一个对象关系映射器,可以将数据库表映射到.NET实体类,使开发者可以使用面向对象的思维来操作数据库。 2. Entity Framework有哪些核心组件? Entity Framework包括以下核心组件: - DbContext:表示数据库上下文,用于管理实体对象与数据库之间的交互。 - DbSet:表示数据库中的实体集合,用于查询、插入、更新和删除实体。 - Entity:表示映射到数据库表的实体类。 - LINQ to Entities:用于编写查询语句,将LINQ查询转换为SQL语句并执行。 3. 如何使用Entity Framework进行数据库操作? 使用Entity Framework进行数据库操作通常包括以下步骤: - 定义实体类:创建表示数据库表的实体类。 - 创建DbContext:继承自DbContext的类,表示数据库上下文。 - 配置映射关系:使用Fluent API或属性注解来配置实体类与数据库表之间的映射关系。 - 执行数据库操作:使用DbContext的方法(如SaveChanges、Add、Remove等)来执行对数据库的增删改查操作。 4. Entity Framework支持哪些数据库提供程序? Entity Framework支持多种数据库提供程序,包括SQL Server、MySQL、Oracle、SQLite等。可以根据需要选择合适的数据库提供程序。 5. 如何进行查询操作? 使用Entity Framework可以使用LINQ查询语法或方法链式调用来进行查询操作。通过DbContext的DbSet属性获取实体集合,然后可以使用LINQ查询来过滤、排序和投影数据。 6. 如何进行数据迁移? 数据迁移是Entity Framework提供的一种机制,用于管理数据库结构的变更。可以使用命令行工具或Package Manager Console来创建和应用数据迁移脚本,以保持数据库结构与代码模型的一致性。 .NET Entity Framework是一个功能强大且广泛使用的ORM框架,它简化了与数据库的交互,提高了开发效率。建议深入学习和掌握Entity Framework的各种特性和用法,以便在实际项目中充分发挥其优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bzhyan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值