C\#LINQ to SQL 구성 요 소 를 조작 하여 데이터베이스 모델 링 을 하 는 기본 튜 토리 얼

19679 단어 C#LINQ
실체 클래스 만 들 기
LINQ to SQL 을 사용 할 때 데이터베이스 대상 을 매 핑 하 는 모델,즉 실체 류 를 먼저 만들어 야 합 니 다.실행 할 때 LINQ to SQL 은 LINQ 표현 식 이나 조회 연산 자 에 따라 SQL 문 구 를 생 성하 여 데이터베이스 에 보 내 조작 합 니 다.데이터베이스 가 되 돌아 오 면 LINQ to SQL 은 결 과 를 실체 클래스 대상 으로 변환 합 니 다.
LINQ to SQL 디자이너,수 동 인 코딩 생 성,XML 파일 맵 사용,명령 행 도구 SqlMetal 생 성 등 실체 클래스 를 만 드 는 방법 은 다양 합 니 다.그 중에서 도 가장 편리 한 것 은 LINQ to SQL 디자이너 다.
1.LINQ to SQL 디자이너 를 사용 하여 실체 클래스 만 들 기        
예제 용 데모 콘 솔 프로그램 에"서비스 기반 데이터베이스"Database 1.mdf 를 추가 하여 tb 를 만 듭 니 다.GuestInfo 시계.이 표 의 상세 함 은 다음 과 같다.
201637151447232.png (410×180)
아래 의 모든 구축 방식 은 이 데이터 베 이 스 를 사용 합 니 다.
프로젝트 에 LINQ to SQL 클래스 를 추가 하고 기본 이름 DataClasses 1.dbml 를 사용 합 니 다.다음 과 같 습 니 다.
201637151549229.jpg (955×608)
tbGuestInfo 시 계 를 인터페이스 에 끌 어 다 놓 고 저장 합 니 다.
201637151656732.png (240×183)
OK,관련 코드 를 다음 과 같이 작성 하여 삭제 와 검 사 를 실현 합 니 다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQ_To_SQL          
{
  /// <summary>
  ///       ___1.VS     
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      //
      DataClasses1DataContext dc = new DataClasses1DataContext();
      
      //1.  
      IQueryable<tb_GuestInfo> query = from p in dc.tb_GuestInfo
                       where p.Name != "XXX"
                       select p;

      foreach (var g in query)
      {
        Console.WriteLine("{0} {1} {2} {3}",g.Id,g.Name,g.Age ,g.Tel );
      }

      Console.WriteLine("-----------------");
      Console.ReadKey(false);
      //2.      
      tb_GuestInfo gInfo = new tb_GuestInfo() { Id = 9, Name = "M&M", Age = 40, Tel = "135****5555" };
      dc.tb_GuestInfo.InsertOnSubmit(gInfo);
      dc.SubmitChanges();

      foreach (var g in query)
      {
        Console.WriteLine("{0} {1} {2} {3}",g.Id , g.Name, g.Age, g.Tel);
      }

      Console.WriteLine("-----------------");
      Console.ReadKey(false);

      //3.  
      var query_itemToDelete = from g in dc.tb_GuestInfo
                   where g.Name == "M&M"
                   select g;
      foreach (var g in query_itemToDelete)
      {
        dc.tb_GuestInfo.DeleteOnSubmit(g);
      }
      dc.SubmitChanges();


      foreach (var g in query)
      {
        Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
      }
      Console.WriteLine("-----------------");
      Console.ReadKey(false);

      //4.  
      var query_itemToUpdate = from g in dc.tb_GuestInfo
                   where g.Name.Contains("DebugLZQ")
                   select g;

      foreach (var g in query_itemToUpdate)
      {
        g.Name = g.Name + "A";
      }
      dc.SubmitChanges();


      foreach (var g in query)
      {
        Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
      }

      Console.WriteLine("-----------------");
      Console.ReadKey(false);

    }
  }
}

프로그램 실행 결 과 는 다음 과 같 습 니 다.
201637151722687.png (677×442)
2.수 동 으로 실체 클래스 만 들 기                    
실체 류 는 대부분 상황 에서 LINQ to SQL 류 디자이너 를 통 해 구축 할 수 있다.물론 간단 한 실체 류 를 구축 하 는 것 도 어렵 지 않 고 LINQ to SQL 의 대상 모델 을 잘 배 울 수 있다.데이터 베 이 스 는 여전히 앞의 예제 데이터 베이스 이다.
항목 에 GuestInfoEntity.cs 클래스 를 추가 합 니 다.다음 과 같 습 니 다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq.Mapping;

namespace DataContexDemo
{
  /// <summary>
  ///        
  /// </summary>
  [Table(Name="tb_GuestInfo")]
  class GuestInfoEntity
  {
    [Column(IsPrimaryKey=true,DbType="Int NOT NULL IDENTITY",IsDbGenerated=true,Name="Id")]
    public int ID { get; set; }

    [Column(DbType = "nvarchar(20)", Name = "Name")]
    public string Name{get;set;}

    [Column(DbType = "int", Name = "Age")]
    public int Age { get; set; }

    [Column(DbType = "nvarchar(20)", Name = "Tel")]
    public string Tel { get; set; }
  }
}

예제 코드 를 작성 하려 면 System.Data.Linq.dll 을 도입 해 야 합 니 다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;//  

namespace DataContexDemo
{
  class Program
  {
    static void Main(string[] args)
    {
      //2.       
      //
      //     
      string constring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL          \Database1.mdf;Integrated Security=True;User Instance=True";

      DataContext dc = new DataContext(constring);

      Table<GuestInfoEntity> tb = dc.GetTable<GuestInfoEntity>();

      var query = tb.AsEnumerable();

      foreach (var q in query)
      {
        Console.WriteLine("{0} {1} {2} {3}",q.ID,q.Name,q.Age,q.Tel );
      }

      Console.ReadKey();
    }
  }
}

프로그램 실행 은 다음 과 같 습 니 다:
201637151816553.png (677×442)
3.XML 맵 파일 을 사용 하여 실체 클래스 만 들 기                         
 실체 클래스 의 맵 은 내 연 된 Attribute 를 사용 하 는 것 외 에 맵 정 보 를 포함 하 는 XML 파일 을 만 들 수 있 습 니 다.이 파일 은 System.Data.Linq.Mapping.XmlMappingSource 대상 을 생 성하 여 DataContext 대상 구조 방법의 매개 변수 로 사용 할 수 있 습 니 다.
이 XML 파일 은 데이터베이스 정 보 를 비 추 는 데 사용 할 루트 노드 인 Database 요소 만 있 습 니 다.Database 요 소 는 하나 이상 의 Table 요 소 를 포함 하여 데이터베이스 시트 의 정 보 를 매 핑 하 는 데 사 용 됩 니 다.Table 요 소 는 하나의 Type 요소 와 여러 개의 Column 요소(또는 Association 요소)로 구성 되 어 있 습 니 다.Type 요 소 는 실체 류 를 지정 하고 Column 요 소 는 열 정 보 를 지정 하 며 Association 요 소 는 데이터 베 이 스 를 매 핑 하 는 데 사 용 됩 니 다.
프로젝트 에 XML 파일 을 추가 합 니 다.기본 이름 XMLfile1.xml 을 사용 합 니 다.내용 은 다음 과 같 습 니 다.

<?xml version="1.0" encoding="utf-8" ?>
<Database Name="Database1" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007"><!--        ;         -->
 <Table Name="tb_GuestInfo"><!--        -->
  <Type Name="LINQtoSQL     _XML.GuestInfoEntity"><!-- BT ,     ;GuestInfoEntity    -->  
   <Column Name="Id" Member="ID" DbType="Int NOT NULL IDENTITY" IsPrimaryKey="true"/>
   <Column Name="Name" Member="Name" DbType="nvarchar(20)" />
   <Column Name="Age" Member="Age" DbType="int" />
   <Column Name="Tel" Member="Tel" DbType="nvarchar(20)" />
  </Type>
 </Table>
</Database>

이 XML 파일 은 모든 종류의 맵 정 보 를 포함 하고 있 습 니 다.다음은 맵 의 클래스 GuestInfoEntity.cs 를 만 듭 니 다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQtoSQL     _XML
{
  public class GuestInfoEntity
  {    
    public int ID { get; set; }
    
    public string Name { get; set; }
    
    public int Age { get; set; }
    
    public string Tel { get; set; }
  }
}

예제 코드 를 작성 하려 면 System.Data.Linq.dll 을 도입 해 야 합 니 다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.IO;//

namespace LINQtoSQL     _XML
{
  class Program
  {
    static void Main(string[] args)
    {
      string constring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL          \Database1.mdf;Integrated Security=True;User Instance=True";

      XmlMappingSource map = XmlMappingSource.FromXml(File.ReadAllText("XMLFile1.xml"));

      DataContext dc = new DataContext(constring, map);

      Table<GuestInfoEntity> tb = dc.GetTable<GuestInfoEntity>();

      var query = tb.AsEnumerable();

      foreach (var g in query)
      {
        Console.WriteLine("{0} {1} {2} {3}",g.ID,g.Name,g.Age,g.Tel );
      }
      Console.ReadKey();
    }
  }
}

프로그램의 실행 은 다음 과 같 습 니 다.
201637151900484.png (677×442)
데이터베이스 연결 에 사용 할 DataContext 대상 구성원
DataContext 클래스 는 System.Data.Linq.dll 프로그램 이 집 중 된 System.Data.Linq 이름 공간 에 있 습 니 다.LINQ to SQL 에 서 는 실체 대상 과 데이터 베이스 간 의 데이터 교환 및 기타 데이터 베이스 작업 을 담당 하고 데이터 베이스 에 있 는 데 이 터 를 실체 류 로 매 핑 하 는 인 스 턴 스 도 책임 집 니 다.
DataContext 는 LINQ to SQL 작업 실체 클래스 가 만들어 진 후 바로 작업 해 야 할 대상 입 니 다.본 고 는 상용 함수 와 속성의 작용 과 상용 용법 을 정리 하고 자 한다.실체 류 는 지난 절의 GuestInfo.cs 류 이 고 데이터베이스 도 지난 절의 데이터베이스 Database 1.mdb 를 사용한다.아래 의 예시 프로그램 은 대상 과 속성 을 그 기능 에 따라 필요 한 그룹 으로 나 누 었 고 코드 에 도 상세 한 주석 이 있다.코드 는 다음 과 같 습 니 다:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.IO;
using System.Data.SqlClient;

namespace DataContext    
{
  /// <summary>
  ///         DataContext   
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      
      //     
      string constring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL          \Database1.mdf;Integrated Security=True;User Instance=True";
      //1.    
      DataContext dc = new DataContext(constring);
      //2.GetTable
      Table<GuestInfoEntity> table = dc.GetTable<GuestInfoEntity>();
      var query = table.AsEnumerable();
      foreach(var g in query)
      {
        Console.WriteLine("{0} {1} {2} {3}",g.ID,g.Name,g.Age,g.Tel );
      }
      Console.WriteLine("-----------------");
      Console.ReadKey();

      string fileName = @"E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL          \Database1.mdf";
      //3.DatabaseExists、DeleteDatabase、CreateDatabase
      if (dc.DatabaseExists())
      {
        Console.WriteLine("         .");
        dc.DeleteDatabase();
      }
      dc.CreateDatabase();
      if (dc.DatabaseExists())
      {
        Console.WriteLine("{0}          .",Path.GetFileName(fileName ));
      }
      Console.WriteLine("-----------------");
      Console.ReadKey();
      //4_1.ExecuteCommand   LINQ     SQL       
      dc.ExecuteCommand("insert into tb_GuestInfo(Name,Age,Tel) values({0},{1},{2})","DebugLZQ",25,"198****1336");

      foreach (var r in dc.GetTable<GuestInfoEntity>())
      {
        Console.WriteLine("{0} {1} {2} {3}",r.ID,r.Name,r.Age,r.Tel );
      }
      Console.WriteLine("-----------------");
      Console.ReadKey();
      //4_2.ExecuteQuery   LINQ     SQL       
      var rows= dc.ExecuteQuery<GuestInfoEntity>("select * from tb_GuestInfo");

      foreach (var r in rows)
      {
        Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel);
      }
      Console.WriteLine("-----------------");
      Console.ReadKey();
      //4_3Translate  DbReader   LINQ  
      string queryString = "select * from tb_GuestInfo";
      SqlConnection connection = new SqlConnection(constring);
      SqlCommand cmd = new SqlCommand(queryString, connection);
      connection.Open();

      var result = dc.Translate<GuestInfoEntity>(cmd.ExecuteReader());//ADO.NET  LINQ

      foreach (var r in result)
      {
        Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel);
      }
      connection.Close();
      Console.WriteLine("-----------------");
      Console.ReadKey();
      //5.SubmitChanges     
      var firstrow = (from p in dc.GetTable<GuestInfoEntity>()            
            select p).First();
      firstrow.Name =firstrow.Name +"A";

      dc.SubmitChanges();//    

      foreach (var r in dc.GetTable<GuestInfoEntity>() )
      {
        Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel);
      }
      Console.WriteLine("-----------------");
      Console.ReadKey();
      //6.GetChangeSet     DataContext    、  、      
      ChangeSet cs = dc.GetChangeSet();
      foreach (var r in cs.Updates )
      {
        GuestInfoEntity t = r as GuestInfoEntity;
        Console.WriteLine("{0} {1} {2} {3}", t.ID,t.Name,t.Age,t.Tel );
      }
      Console.WriteLine("-----------------");
      Console.ReadKey();
      //7.Refresh      
      var row1=(from g in dc.GetTable<GuestInfoEntity>() select g).First();
      row1.Age = row1.Age + 5;
      dc.SubmitChanges();
      dc.Refresh(RefreshMode.OverwriteCurrentValues, row1);//

      foreach (var r in dc.GetTable<GuestInfoEntity>())
      {
        Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel);
      }
      Console.WriteLine("7-----------------");
      Console.ReadKey();
      //ChangeConflicts     DataContext               

      //Transaction        DataContext   ADO.NET         

      //ObjectTrackingEnabled        DataContext            
   
      //8.Log     DataContext   SQL  
      dc.Log = Console.Out;//     DataContext   SQL  

      foreach (var r in dc.GetTable<GuestInfoEntity>())
      {
        Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel);
      }
      Console.WriteLine("-----------------");
      Console.ReadKey();

    }
  }
}

프로그램 중의 주석 은 매우 상세 해서 더 이상 군말 하지 않 는 다.
프로그램의 실행 결 과 는 다음 과 같다.
201637152021439.png (677×442)
단일 표 의 Table클래스 를 조작 합 니 다.
앞에서 DataContext 류 를 소 개 했 는데 데이터 베 이 스 를 매 핑 하고 연결 하 며 SQL 명령 을 실행 하여 실체 대상 의 상 태 를 추적 할 수 있 습 니 다.
다음은 표 의 기록 을 나타 내 는 Table를 소개 합 니 다.이것 은 일반적인 집합 류 이 고 그 요 소 는 표 의 실체 대상 입 니 다.이것 은 요 소 를 추가 하고 삭제 하 는 방법 을 제공 하 며 DataContext 를 통 해 이 조작 을 데이터베이스 에 저장 할 수 있 습 니 다.
표 는 앞의 표 입 니 다.프로젝트 에 LINQ to SQL 류 를 추가 하 였 습 니 다.포 인 트 는 InsertOnSubmit,DeleteOnSubmit 등 방법 이다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQ_to_SQL_Table
{
  /// <summary>
  ///        Table<TEntity> 
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      //1.a.Attach    
      DataClasses1DataContext dc1 = new DataClasses1DataContext();
      tb_GuestInfo guset = new tb_GuestInfo() { Id=1, Name = "DebugLZQ", Age = 35, Tel = "138****8888" };

      dc1.tb_GuestInfo.Attach(guset);//   Attach      ,       
      dc1.SubmitChanges();
      //      
      foreach (var g in dc1.tb_GuestInfo)
      {
        Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
      }
      Console.WriteLine("---------");
      //         
      DataClasses1DataContext dc2 = new DataClasses1DataContext();
      foreach (var g in dc2.tb_GuestInfo)
      {
        Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
      }
      Console.WriteLine("------------------------");
      Console.ReadKey();

      //2.InsertOnSubmit
      dc2.tb_GuestInfo.InsertOnSubmit(guset);
      dc2.SubmitChanges();

      foreach (var g in dc2.tb_GuestInfo)
      {
        Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
      }
      Console.WriteLine("------------------------");
      Console.ReadKey();
      //2b.InsertAllOnSubmit     
      List<tb_GuestInfo> lst = new List<tb_GuestInfo>() 
      {
        new tb_GuestInfo(){ Name="AA", Age=25,Tel="133****3333"},
        new tb_GuestInfo(){ Name="BB", Age=25,Tel="135****5555"}
      };
      dc2.tb_GuestInfo.InsertAllOnSubmit(lst);
      dc2.SubmitChanges();

      foreach (var g in dc2.tb_GuestInfo)
      {
        Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
      }
      Console.WriteLine("------------------------");
      Console.ReadKey();
      //
      //3.DeleteOnSubmit
      tb_GuestInfo entity = (from g in dc2.tb_GuestInfo
                  where g.Name == "AA"
                  select g).Single();
      dc2.tb_GuestInfo.DeleteOnSubmit(entity);//
      dc2.SubmitChanges();

      foreach (var g in dc2.tb_GuestInfo)
      {
        Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
      }
      Console.WriteLine("------------------------");
      Console.ReadKey();
      //3b.DeleteAllOnSubmit
      IEnumerable<tb_GuestInfo> entitys = from g in dc2.tb_GuestInfo
                        where g.Name == "AA" || g.Name == "BB"
                        select g;
      dc2.tb_GuestInfo.DeleteAllOnSubmit(entitys);
      dc2.SubmitChanges();

      foreach (var g in dc2.tb_GuestInfo)
      {
        Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
      }
      Console.WriteLine("------------------------");
      Console.ReadKey();      
      
    }
  }
}

프로그램 실행 결 과 는 다음 과 같 습 니 다.
201637152048997.png (677×458)

좋은 웹페이지 즐겨찾기