您是第 Web Page Tracking 位访客

水~墨~

昂首阔步,不留一点遗憾!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
 

 

orm  对象关系映射框架,主要将关系数据库中的数据 ,映射成应用程序的对象。表为类名,列为类的字段。

ADO.NET entity framework   在ADO.NET基础上发展出来的对象关系模型 orm的解决方案。

 

LINQ,语言集成查询(Language INtegrated Query)是一组用于c#和Visual Basic语言的扩展。它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。

 

 

在开发过程中,有2种方式可以根据数据库的表生成相应的对象模型。

  • OR设计器(直接拖放表,视图,存储过程到or设计器则自动生成 Northwind.dbml (包含Northwind.dbml.layout 和 Northwind.designer.cs)文件  (源代码及属性或者映射文件))
  • 另一个是通过 sqlmetal 命令生成 Northwind.cs.  命令代码(将c/Northwind.mdf 生成Northwind.cs):通过 sqlmetal /code:"C:\Users\mikple\Documents\Visual Studio 2008\Projects\WebApplication1\WebApplication1\App_Data\northwind.cs" /language:csharp "C:\Users\mikple\Documents\Visual Studio 2008\Projects\WebApplication1\WebApplication1\App_Data\Northwind.MDF" /sprocs /functions /pluralize

第一种生成的 Northwind.designer.cs 里面存放的是主要的映射代码,和映射的属性。

第二种生成的Northwind.cs 里是根据数据库映射的文件。

区别:第一种通过or设计器生成的代码新建linq to sql类,命名 Northwind.dbml 映射文件会自动加上

         public partial class NorthwindDataContext : System.Data.Linq.DataContext

相同: 都继承  System.Data.Linq.DataContext

 

 

1.使用OR设计器根据数据库生成映射文件

 

右击项目-->添加新建项-->选择 LINQ TO SQL类

image

 

新建后生成的文件,主要有用的是*.designer.cs 存放的是映射的代码,*.dbml.layout 主要是用来将表,存储过程,视图放到or设计器上,自动生成代码。

 

 

image

image

开始选定Northwind数据库,将admin表拖放到or设计器上

image

选定左侧的admin表,然后直接拖放到上图中间部分。

 

image

 

image

 

image

 

DataClasses1.designer.cs 包含了admin表和列的信息。

 

 拖放后新增的代码如下(数据库itweb,表为admin)
 

 

2.开始使用Linq to sql 查询 admin 表的 所有id 列信息

 

protected void Page_Load(object sender, EventArgs e)
       {

           DataClasses1DataContext d1 = new DataClasses1DataContext();         //这个说明连接了数据库。
           //从admin表中读取数据

           var a = from b in d1.admin
                   select b.id;

           foreach (var item in a)
           {

               Response.Write(item);
               Response.Write("\r\n");
           }

       }

 

这个是自动生成的查询语句,可以通过sql profile 查看。

image s

 

通过linq to sql 插入数据

插入之前的admin 表的数据 image

 

执行代码

protected void Page_Load(object sender, EventArgs e)
       {

           DataClasses1DataContext d1 = new DataClasses1DataContext();
           
           //向admin中插入数据

           admin a = new admin();
           a.admin1 = "mike";
           a.password = "password12345";

           d1.admin.InsertOnSubmit(a);        //表中插入实体,只是更改了内存

           d1.SubmitChanges();                //提交更改





       

       }

 

插入数据库后的数据为  image

 

 

 

update对象时候,直接在此对象上执行更新新值,然后通过   d1.SubmitChanges()操作。

 

 

protected void Page_Load(object sender, EventArgs e)
     {

         DataClasses1DataContext d1 = new DataClasses1DataContext();
         
         //更改admin表中 admin属性为 mike的改为 jerry

         var u = (from c in d1.admin
                 where (c.admin1 == "mike")
                 select c).First();


         u.admin1 = "jerry";



         d1.SubmitChanges();                //提交更改





     

     }

image

 

删除数据  调用 DeleteOnSubmit 以将该对象从集合中移除。最后,调用 SubmitChanges 以将删除内容转发至数据库。

例:删除admin表中,admin列为jerry的行数据。

 

image   可见删除成功了。

 

 

linq to sql总结:

1. 数据库实例连接    DataClasses1DataContext d1 = new DataClasses1DataContext();

2. 查询数据:  from xx in d1.表1

   增加数据:   先生成实体,接着 insertOnSubmit(),最后 d1.SubmitChanges();

   删除数据:   先查询到实体,然后deleteOnSubmit() ,最后 submitChanges();

   更新数据:   查询到实体,直接在这实体上更改,最后SubmitChanges();s

  

 

 

下载的 Northwind 2005&&2008 的  *.bak文件,还原数据库。

下载的*.bak 文件放到 C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\Backup

image

image

image

 

 

LINQ TO 存储过程(Northwind.mdf 数据库)

1. MSSQL管理器创建存储过程,拖到存储过程到or设计器中,自动生成  *.dbml。

[Function(Name="dbo.[Customers By City]")] //function 代表存储过程
        public ISingleResult<Customers_By_City_个结果> Customers_By_City([Parameter(DbType="NVarChar(20)")] string param1)
        {
            IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), param1);
            return ((ISingleResult<Customers_By_City_个结果>)(result.ReturnValue));
        }

 

2. linq to 存储过程,调用刚才的存储过程返回集合

protected void Page_Load(object sender, EventArgs e)
       {

           DataClasses1DataContext db = new DataClasses1DataContext();
           
           //调用存储过程

           var result = db.Customers_By_City("London");//调用存储过程

           foreach (var a in result)
           {
               Response.Write(a.ContactName +"<br/>");
           }




       

       }
 
结果图:image 
 
 
 
------------------------------------------------------------------------
linq 存储过程
1)调用带输入参数的存储过程返回行集
DataClasses1DataContext db = new DataClasses1DataContext();
           
           //调用存储过程

           var result = db.Customers_By_City("London");  //存储过程名字  Customers_By_City

           foreach (var a in result)
           {
               Response.Write(a.ContactName +"<br/>");
           }

2)调用带输入,输出参数的存储过程

 

 

         DataClasses1DataContext db = new DataClasses1DataContext();
           
           //调用存储过程
           decimal? total = 0;   //ref 必须有初值
           var result = db.CustOrderTotal("ALFKI", ref total);  //ref不能省略

           Response.Write(total.ToString()+"<br/>");
           
 
-----------------------------------------
Visual Studio 的开发人员通常会使用对象关系设计器来映射存储过程 
或者 自行编写代码。
 image 

为多个结果形状映射的存储过程 (LINQ to SQL)

CREATE PROCEDURE VariableResultShapes(@shape int)
AS
if(@shape = 1)
    select CustomerID, ContactTitle, CompanyName from customers
else if(@shape = 2)
    select OrderID, ShipName from orders

 

 

通过 sqlmetal /code:"C:\Users\mikple\Documents\Visual Studio 2008\Projects\WebApplication1\WebApplication1\App_Data\northwind.cs" /language:csharp "C:\Users\mikple\Documents\Visual Studio 2008\Projects\WebApplication1\WebApplication1\App_Data\Northwind.MDF" /sprocs /functions /pluralize

此处用or设计器的不足就体现出来了,用or设计器只会产生  VariableResultShapesResult1 返回集类型。用sqlmetal命令则可以自动生成2种类型。

 

自动生成Linq to sql类 Northwind.cs

VariableResultShapesResult1 和 VariableResultShapesResult2

生成的dbo.VariableResultShapes存储过程代码

通过sqlmetal生成代码,可以自动感知存储过程可能会返回2种不同的结果集,当然对应的关系实体也不同。则自动生成 VariableResultShapesResult1 和2.
开始使用其代码 GetResult
public partial class _Default : System.Web.UI.Page
   {
   
       protected void Page_Load(object sender, EventArgs e)
       {

      Northwind db = new Northwind(@"C:\Northwind.MDF");

      IMultipleResults result = db.VariableResultShapes(1);



      foreach (VariableResultShapesResult1 compName in
    result.GetResult<VariableResultShapesResult1>())
      {
          Response.Write(compName.CompanyName+"<br/>");
      }

      


        //  sqlmetal /code:"C:\Users\mikple\Documents\Visual Studio 2008\Projects\WebApplication1\WebApplication1\App_Data\northwind.cs" /language:csharp "C:\Users\mikple\Documents\Visual Studio 2008\Projects\WebApplication1\WebApplication1\App_Data\Northwind.MDF" /sprocs /functions /pluralize 




       

       }

 

 

*使用为顺序结果形状映射的存储过程 (LINQ to SQL)

CREATE PROCEDURE MultipleResultTypesSequentially
AS
select * from products
select * from customers

 

 

新添加存储过程后,可以通过手写代码添加存储过程的映射,也可以通过sqlmetal 命令 自动生成*.cs

使用sqlmetal命令后,Northwind.cs 新增的代码如下。

dbo.MultipleResultTypesSequentially

返回的2种结果集类型


程序中使用刚才的存储过程 

 

Northwnd db = new Northwnd(@"c:\northwnd.mdf");
IMultipleResults sprocResults =
    db.MultipleResultTypesSequentially();
// First read products.
foreach (Product prod in sprocResults.GetResult<Product>())
{
    Console.WriteLine(prod.ProductID);
}
// Next read customers.
foreach (Customer cust in sprocResults.GetResult<Customer>())
{
    Console.WriteLine(cust.CustomerID);
}

 

使用存储过程来自定义操作 (LINQ to SQL)

将存储过程的方法集合到另外一个类,此类用来供应用程序调用,此类封装了Northwind.cs 里的方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

public class NorthwindThroughSprocs:Northwind
{

    public NorthwindThroughSprocs(string connection) :
        base(connection)
    {
    }

    // Override loading of Customer.Orders by using method wrapper.
    private IEnumerable<Order> LoadOrders(Customer customer)
    {
        return this.CustomerOrders(customer.CustomerID);
    }
    // Override loading of Order.Customer by using method wrapper.
    private Customer LoadCustomer(Order order)
    {
        return this.CustomersByID(order.CustomerID).Single();
    }
    // Override INSERT operation on Customer by calling the
    // stored procedure directly.
    private void InsertCustomer(Customer customer)
    {
        // Call the INSERT stored procedure directly.
        this.ExecuteCommand("exec sp_insert_customer …");
    }
    // The UPDATE override works similarly, that is, by
    // calling the stored procedure directly.
    private void UpdateCustomer(Customer original, Customer current)
    {
        // Call the UPDATE stored procedure by using current
        // and original values.
        this.ExecuteCommand("exec sp_update_customer …");
    }
    // The DELETE override works similarly.
    private void DeleteCustomer(Customer customer)
    {
        // Call the DELETE stored procedure directly.
        this.ExecuteCommand("exec sp_delete_customer …");
    }
}


 

 

//添加验证实体方法。  On字段名字Changing 方法。  规定插入数据库的值不能早于今天

partial void OnRequiredDateChanging(System.Nullable<System.DateTime> value)
   {
       if (value < System.DateTime.Today)
       {
           throw new System.Exception("Required Date cannot be in the past");
       }

   }

posted on 2014-02-21 17:14  水墨.MR.H  阅读(1294)  评论(0编辑  收藏  举报
知识共享许可协议
本博客为水墨原创,基于Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的水墨(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。