zoukankan      html  css  js  c++  java
  • Entity Framework 4.1 CodeFirst实例

     


    Admin
    2011年8月9日

    名人名言:善待乏味的人,有可能到头来会为一个乏味的人工作。——比尔盖茨

    在旧的Entity 框架中,开辟者可以从已存在的数据库中产生营业实体的模型,这种开辟办法被称为数据库驱动的开辟办法。而在4.1的Entity Framework中,支开辟者先创建实体营业类,然后再产生相干的数据库文件,这种开辟办法可以称为“代码先行”的开辟办法。这种办法对于开辟者来说是很有益处的,起首,会让开辟者从面向对象的思维角度出发,去构建营业逻辑中的实体模型,然后再按照实际的须要去生成数据库文件,是真正的面向对象的思维开 发办法。

    本文中要应用Entity Framework 4.1,下面的地址供给4.1的安装包下载:http://down.qiannao.com/space/file/huwlnew/share/2011/8/9/EntityFramework4.1_-4e92-8054-529b-91cf.rar/.page

    或者经由过程NuGet在线安装,选择下面的菜单:

    在VS2010下脚的把握台输入:PM> install-package efcodefirst

    显示内容如下,默示安装成功:

    本文的例子将会创建两个类Invoice类和LineItem类。而本文产生的数据库定名为Accounting,并会产生两张表:Invoice和 LineItem。例子中的功能,还包含可以在gridview中对数据库中的数据进行增删改查,最后,还会演示若是类产生了变更了,如何让响应的数据库 也产生改变。

    步调1

    1) 启动vs.net 2010;

    2) 新建树一个c#说话的asp.net web工程项目;

    3) 将工程定名为project EF4CodeFirst;

    4) 在工程资料经管器中,鼠标右键点击,然后新增一个类,将新增的类定名为Invoice.cs。

    批改这个类的代码如下:

    public class Invoice
    {
    public int ID { get; set; }
    public DateTime InvoiceDate { get; set; }
    public double Total { get; set; }
    }

    在我们的类中,有id这个属性,Entity框架会按照id这个属性,去生成数据库表中的对应字段id,若是类中没定义id这个属性,则会在数据库表文件中生成以“类文件名+ID”如许定名的字段。

    在这个Invoice发票类中,存在多个条目LineItem,它们之间明显构成一对多的关系,所以我们先建树类LineItem类。

    5) 同样,新增一个LineItem类,代码如下:

    public class LineItem
    {
    public int ID { get; set; }
    public string ProductName { get; set; }
    public double ItemCost { get; set; }
    public double Units { get; set; }
    public Invoice Invoice { get; set; }
    }

    在这个类中,保持了对Invoice类的引用,同时也是接洽关系了Invoice类。

    6)而在Invoice类中,也要增长LineItem类的引用,这里要用到的是凑集类,如下代码:

    public ICollection<LineItem> LineItems { get; set; }

    同时要在Invovice类的机关函数中,进行初始化LineItem类,如下:

    public Invoice()
    {
    &#160;&#160;&#160; LineItems = new List<LineItem>();
    }

    在完成上方的步调后,则Entity框架已可以从实体类中创建相干的数据库和表了,下面持续进行步调二。

    步调2

    接下来,我们要引用Entity框架的类库文件到我们的工程中。

    1) 在工程资料经管器中,鼠标右键点击工程名字,在弹出的菜单中选择“添加引用”。

    2) 选择System.Data.Entity ,并点断定完成

    3) 为工程持续增长一个新类,定名为Accounting.cs ,并且批改其代码如下:

    using System.Data.Entity;
    public class Accounting : DbContext
    {
    public DbSet<Invoice> Invoices { get; set; }
    public DbSet<LineItem> LineItems { get; set; }
    }

    可以看到,该类持续了DbContext类,该类实际上是Entity的一个对象类,里面封装了很多有效的API,在Accounting类中,分别有两个DbSet类的实例,它们代表将要在数据库中生成的两个表。

    4)接着须要在web.config中进行添加数据库连接,如下:

    <add name="Accounting"
    providerName="System.Data.SqlClient"
    connectionString="Data Source=(local);Initial Catalog=Accounting;Integrated Security=SSPI;"/>

    5) 接着,在default.aspx 中添加gridview控件,并且编写如下代码:

    using System.Data.Entity;
    protected void Page_Load(object sender, EventArgs e)
    {
    Accounting db = new Accounting();
    db.Invoices.Load();
    GridView1.DataSource = db.Invoices.Local.ToBindingList();
    GridView1.DataBind();
    }

    记得这里必须引入System.Data.Entity类库,并且实例化Accounting对象的实例db,并调用其load办法,加载所有的Invoice数据(这里我们一般是加载一对多的一方的数据)。

    6)运行工程后,你会发明在SQL SERVER中,会呈现了三张表,此中,分别是Invoice表和LineItem表,还有一张表EdmMetadata,是Entity框架为我们主动生成的,保存了数据库中的元数据。别的,可以看到在表LineItem中,Entity框架已经为我们主动生成了外键Invoice_ID。

    步调三

    如今,既然数据库已经创建了,则可认为其增长一些数据了,在page_load中增长如下代码:

    protected void Page_Load(object sender, EventArgs e)
    {
    Accounting db = new Accounting();
    Invoice invoice = new Invoice
    {
    InvoiceDate = DateTime.Now,
    Total = 1000
    };
    db.Invoices.Add(invoice);
    db.SaveChanges();
    db.Invoices.Load();
    GridView1.DataSource = db.Invoices.Local.ToBindingList();
    GridView1.DataBind();
    }

    在这里我们实例化了Invoice类的一个实例,添加了相干的数据内容,然后应用db.Invoices.Add增长到Account类的DBSet属性中,最后调用savechanges办法保存到数据库中,运行后,可以看到如下结果:

    如今我们试下更新数据,代码如下:

    protected void Page_Load(object sender, EventArgs e)
    {
    Accounting db = new Accounting();
    Invoice invoice = new Invoice
    {
    ID = 1,
    InvoiceDate = DateTime.Now,
    Total = 900
    };
    db.Entry(invoice).State = EntityState.Modified;
    db.SaveChanges();
    db.Invoices.Load();
    GridView1.DataSource = db.Invoices.Local.ToBindingList();
    GridView1.DataBind();
    }

    这里把invoice实例的成员变量的ID改为1,重视在更新时,设置其状况(state)为EntityState.Modified,默示是批改记录,最后再保存,运行后,可以看到数据库中的数据的确更新了,所有这些都是Entity 框架在起感化。

    最后进修删除记录,代码如下:

    protected void Page_Load(object sender, EventArgs e)
    {
    Accounting db = new Accounting();
    Invoice invoice = new Invoice
    {
    ID = 1,
    InvoiceDate = DateTime.Now,
    Total = 900
    };
    db.Invoices.Remove(invoice);
    db.SaveChanges();
    db.Invoices.Load();
    GridView1.DataSource = db.Invoices.Local.ToBindingList();
    GridView1.DataBind();
    }

    这里只须要调用Remove办法,即可在数据库中删除该记录。

    步调4

    在这个步调中,我们进修如何改变数据模型。假设我们要在Invoice类中增长一个Tax的属性,也须要Entity框架同步在数据库中增长这个字段,下面演示其步调:

    1)我们在Invoice类中增长Tax这个属性。

    2)若是这时运行工程,则会看到如下的错误提示:

    The model backing the ""Accounting"" context has changed since the database was
    created. Either manually / the database, or call
    Database.SetInitializer with an IDatabaseInitializer instance. For example, the
    DropCreateDatabaseIfModelChanges strategy will automatically and recreate
    the database, and optionally seed it with new data.

    提示告诉我们,或者这个时辰从头手工删除数据库或者应用代码的办法去完成,我们应用代码的办法去完成,只须要在Application_Start事务中编码如下,即可让Entity框架,主动把新增长的属性反应到数据库中:

    void Application_Start(object sender, EventArgs e)
    {
    // Code that runs on application startup
    System.Data.Entity.Database.SetInitializer<Accounting>
    (new System.Data.Entity.DropCreateDatabaseIfModelChanges<Accounting>());
    }

    3) 再次运行工程,会看到数据表中的确增长了Tax这个字段了。

    步调5

    重视,在上方的步调4中,若是类的属性产生变更,则其实是经由过程代码的办法,从头将旧的数据库DROP掉,然后再新建,如许的话费时艰苦,而可以经由过程别的的一个办法实现,即还好我们可以在初始化的过程中添加测试数据,如许每次从头创建数据库的时辰,测试数据就会 主动加进去了,算是解决了一些题目,办法如下:

    1)在工程项目中,新增长一个类,定名为AccountingInitializer.cs

    2)批改其代码如下:

    public class AccountingInitializer :
    System.Data.Entity.DropCreateDatabaseIfModelChanges<Accounting>
    {
    protected override void Seed(Accounting context)
    {
    Invoice invoice = new Invoice { Total = 20, InvoiceDate =
    new DateTime(2011, 4, 14), Tax = 1.50 };
    invoice.LineItems.Add(new LineItem
    { ItemCost = 2, ProductName = "Test", Units = 4 });
    invoice.LineItems.Add(new LineItem
    { ItemCost = 4, ProductName = "Test 2", Units = 3 });
    context.Invoices.Add(invoice);
    context.SaveChanges();
    base.Seed(context);
    }
    }

    此中,在这个类中持续了DropCreateDatabaseIfModelChanges这个类,并且重写了seed这个办法,在这个办法中可以编写新增测试数据。要记得还须要在Application_OnStart事务中编写如下代码:

    void Application_Start(object sender, EventArgs e)
    {
    //在启动过程中履行该段代码
    System.Data.Entity.Database.SetInitializer<Accounting>
    (new AccountingInitializer());
    }

  • 相关阅读:
    hdu 1863 畅通工程(Kruskal+并查集)
    1.1.2最小生成树(Kruskal和Prim算法)
    1.1.1最短路(Floyd、Dijstra、BellmanFord)
    ACM复习专项
    装饰器和偏函数
    Python函数基础
    (六)面向对象高级编程
    Zabbix漏洞利用 CVE-2016-10134
    Struts-S2-045漏洞利用
    F5 BIG-IP 远程代码执行漏洞环境搭建
  • 原文地址:https://www.cnblogs.com/yexinw/p/2695064.html
Copyright © 2011-2022 走看看