LINQ API เพื่อทำงานร่วมกับCaché globals จาก. NET Entity Framwork
## บทนำ“ Globals EF” เป็นกรอบการทำแผนที่วัตถุ/relational (O/RM) สำหรับฐานข้อมูลที่รู้จักกันดี Intersystems Caché อย่างที่คุณทราบฐานข้อมูลCachéนั้นใช้พลังงานจากเอ็นจิ้นข้อมูลหลายมิติที่มีประสิทธิภาพมาก อินเทอร์เฟซที่เปิดเผยการเข้าถึงการเข้าถึงโครงสร้างหลายมิติซึ่งให้ประสิทธิภาพสูงสุดและความเป็นไปได้ในการจัดเก็บข้อมูลที่มากที่สุด Cachéมีประโยชน์มากสำหรับแอปพลิเคชันที่ทำงานกับ "ข้อมูลขนาดใหญ่" และมีแอปพลิเคชันเหล่านี้มากขึ้นเรื่อย ๆ ในปัจจุบัน .NET Framework ด้วยภาษาการเขียนโปรแกรม C# ทำให้การสร้างและบำรุงรักษาแอปพลิเคชันง่ายมากสำหรับนักพัฒนา ดังนั้นการใช้caché intersystems ในแอปพลิเคชัน. NET จึงเป็นงานจริง Intersystems ให้เทคโนโลยีCaché Extreme ที่ให้การเข้าถึง Globals API จากแอปพลิเคชัน. NET แต่การสร้างแอปพลิเคชันยังคงใช้เวลานาน ดังนั้นจุดประสงค์หลักของ Global EF คือการทำงานกับCachéและ GlobalsDB หลักของกรอบนี้คือ Intersystems Caché Extreme Technology เฟรมเวิร์กที่อธิบายไว้ให้ฟังก์ชั่นที่มีประโยชน์มากมายเช่นการทำแผนที่วัตถุ/เชิงสัมพันธ์ LINQ ไปยังโกลบและมีปฏิสัมพันธ์กับCachéและ GlobalsDB ง่ายและราบรื่น
## การติดตั้ง
## API สาธารณะ
#### คลาส DBSET
คลาส DbSet<TEntity> แสดงถึงเอนทิตีที่ใช้สำหรับการสร้างอ่านอ่านอัปเดตและลบการดำเนินงาน
คลาสนี้ใช้อินเทอร์เฟซ IOrderedQueryable<TEntity> และ IQueryProvider อินเตอร์เฟสดังนั้นคุณสามารถใช้การแสดงออก LINQ บนอินสแตนซ์ DbSet<TEntity> สำหรับการรับข้อมูลจากฐานข้อมูล เนื่องจากการใช้งานของ IOrderedQueryable<TEntity> คุณยังสามารถใช้การเรียงลำดับการค้นหาเช่น orderby, orderbydescending, จากนั้นหรือจากนั้น
คลาส DBSET ยังใช้อินเทอร์เฟซ IDbSet<TEntity> ซึ่งประกาศวิธีการต่อไปนี้:
void InsertOnSubmit ( TEntity entity ) ;
void InsertAllOnSubmit ( IEnumerable < TEntity > entities ) ;
void UpdateOnSubmit ( TEntity entity ) ;
void UpdateAllOnSubmit ( IEnumerable < TEntity > entities ) ;
void DeleteOnSubmit ( TEntity entity ) ;
void DeleteAllOnSubmit ( IEnumerable < TEntity > entities ) ; วิธีการเหล่านี้สามารถใช้สำหรับการดำเนินการที่สอดคล้องกับข้อมูล คุณสามารถจัดการเอนทิตีเดี่ยวหรือชุดของเอนทิตี
#### tentity
พารามิเตอร์ทั่วไปสำหรับคลาสที่อธิบายไว้ก่อนหน้านี้ ( DbSet<TEntity> ) แสดงถึงเอนทิตีที่คุณต้องจัดเก็บในฐานข้อมูล ข้อ จำกัด สำหรับ Tentity - มันจะต้องเป็นชั้นเรียนที่ประกาศว่าเป็นสาธารณะ
ในชั้นเรียนนี้คุณสามารถประกาศคุณสมบัติสาธารณะที่สอดคล้องกับนิติบุคคล
โปรดทราบว่าในฐานข้อมูลที่เก็บไว้เฉพาะคุณสมบัติเหล่านั้นซึ่งตรงตามข้อกำหนดดังต่อไปนี้:
#### คอลัมน์
ColumnAttribute สามารถนำไปใช้กับคุณสมบัติของเอนทิตีเพื่อระบุว่าคุณสมบัตินี้จะต้องเก็บไว้ในฐานข้อมูล
ColumnAttribute มีคุณสมบัติดังต่อไปนี้:
public string Name { get ; set ; } ระบุว่าคุณสมบัติของเอนทิตี (คอลัมน์) จะต้องเก็บไว้ในฐานข้อมูลที่มีชื่ออื่นสั้นกว่าของตัวอย่าง หากไม่มีค่าให้ใช้ชื่อของคุณสมบัติในคลาสเอนทิตี ตัวอย่างเช่นในกรณีนี้
[ Column ( Name = "Id" ) ]
public int IdentificationNumber { get ; set ; } ทรัพย์สินจะถูกเก็บไว้เป็น“ id” และในกรณีนี้
[ Column ( Name = "Id" ) ]
public int IdentificationNumber { get ; set ; } เป็น“ ตัวระบุจำนวน”
public bool IsPrimaryKey { get ; set ; } ระบุว่าคอลัมน์เป็นคีย์หลัก คุณสามารถอธิบายคีย์หลักที่ซับซ้อนได้โดยใช้ ColumnAttribute (ด้วยคุณสมบัติ IsPrimaryKey ที่ตั้งค่าเป็นจริง) กับหลายคอลัมน์ Framework จัดการคีย์หลักและจะโยน GlobalsDbException ("การละเมิดข้อ จำกัด หลักหลักไม่สามารถแทรกคีย์ที่ซ้ำกันได้") หากคุณพยายามแทรกเอนทิตีที่มีคีย์หลักเดียวกัน
public bool IsDbGenerated { get ; set ; } ระบุว่าคอลัมน์คีย์หลักคือ IDENTITY นั่นคือสร้างโดยเฟรมเวิร์ก รองรับเฉพาะประเภทจำนวนเต็ม ( Int16 , Int32 และ Int64 )
มีกฎบางอย่างสำหรับการใช้ ColumnAttribute ในเอนทิตี:
IsPrimaryKey ของ ColumnAttributeshort , int หรือ long ) ที่รองรับเป็นคอลัมน์ DbGeneratedDbGenerated เพียงคอลัมน์เดียวเท่านั้นDbGenerated หรือปุ่มหลักที่กำหนดเองได้ หากกฎเหล่านี้ไม่เป็นไปตาม EntityValidationException จะถูกโยนลงไป หากเอนทิตีมีรหัสประจำตัวเฟรมเวิร์กจะสร้างให้ใส่เอนทิตีลงในฐานข้อมูลและตั้งค่าเป็นคอลัมน์ที่ทำเครื่องหมายเป็นคีย์ตัวตน
#### dbsetattribute
Dbsetattribute สามารถนำไปใช้กับคลาส Tentity แอตทริบิวต์นี้อธิบายคุณสมบัติเดียวเท่านั้น
public string Name { get ; set ; }ระบุว่าทั่วโลกสำหรับเอนทิตีในฐานข้อมูล Globals ต้องมีชื่ออื่น การใช้งานคล้ายกับการใช้คุณสมบัติเดียวกันในคอลัมน์
การใช้ DbSetAttribute กับคลาส tentity ไม่ได้บังคับ
#### DataContext
คลาสนามธรรมที่ให้การเชื่อมต่อกับฐานข้อมูล คุณต้องสร้างคลาสที่ได้รับด้วยชุดของ DbSet<TEntity> คุณสมบัติสาธารณะหรือฟิลด์เพื่อเข้าถึงข้อมูลฐานข้อมูล
วิธีการสาธารณะที่ประกาศว่า SubmitChanges() ส่งการเปลี่ยนแปลงทั้งหมดด้วยฐานข้อมูลที่ใช้ได้ทำด้วยวิธีการสาธารณะของคลาส DbSet<TEntity> (เช่น InsertOnSubmit(TEntity entity) )
คลาส DataContext มีตัวสร้างที่ได้รับการป้องกันสองตัว
protected DataContext(string namespc, string user, string password)protected DataContext()#### globalsdbexception
เฟรมเวิร์กโยน globalsdbexception ในกรณีต่อไปนี้:
#### entityValidationException
เฟรมเวิร์กโยน EntityValidationException เมื่อลูกค้าได้ประกาศเอนทิตีที่ไม่เป็นไปตามข้อกำหนดดังต่อไปนี้:
IsPrimaryKey ของ ColumnAttributeshort , int หรือ long ) ที่รองรับเป็นคอลัมน์ DbGeneratedDbGenerated เพียงคอลัมน์เดียวเท่านั้นDbGenerated หรือปุ่มหลักที่กำหนดเองได้## วิธีใช้
โดยพื้นฐานแล้วความต้องการของคุณในการประกาศคลาสโมเดลโดเมน ในตัวอย่างนี้โมเดลโดเมนประกอบด้วยสี่หน่วยงาน (ประเทศคณะมหาวิทยาลัยและเมือง) ซึ่งเป็นลำดับชั้นที่ซับซ้อน ทุกคุณสมบัติในเอนทิตีซึ่งคุณต้องเก็บไว้ในฐานข้อมูลจะต้องทำเครื่องหมายด้วย ColumnAttrubute
หน่วยงานเหล่านี้ได้รับการประกาศในลักษณะนั้น:
public sealed class Country
{
[ Column ( IsPrimaryKey = true ) ]
public string Name { get ; set ; }
[ Column ( ) ]
public Continent Continent { get ; set ; }
[ Column ( ) ]
public bool HasSee { get ; set ; }
[ Column ( ) ]
public List < Town > Towns { get ; set ; }
} public sealed class Town
{
[ Column ( ) ]
public string Name { get ; set ; }
[ Column ( ) ]
public bool IsCapital { get ; set ; }
[ Column ( ) ]
public int Population { get ; set ; }
[ Column ( ) ]
public List < University > Universities { get ; set ; }
} public sealed class University
{
[ Column ]
public string Name { get ; set ; }
[ Column ]
public string Description { get ; set ; }
[ Column ]
public List < Faculty > Faculties { get ; set ; }
} public class Faculty
{
[ Column ( ) ]
public string Name { get ; set ; }
[ Column ]
public string Description { get ; set ; }
} อย่างที่คุณเห็นทุกประเทศมีรายชื่อเมืองทุกเมืองมีรายชื่อมหาวิทยาลัยและทุกมหาวิทยาลัยมีรายการของคณะ มีการจัดหา ColumnAttribute สำหรับทุกคอลัมน์ซึ่งจำเป็นต้องเก็บไว้ในฐานข้อมูล
ฉันกำลังจะจัดเก็บเอนทิตีของประเทศในฐานข้อมูลและหน่วยงานเด็กทั้งหมดจะได้รับการจัดอันดับให้กับ Globals ในฐานข้อมูลCachéโดยอัตโนมัติ ตามกฎของ ColumnAttribute ฉันต้องประกาศคีย์หลักสำหรับประเทศนิติบุคคล ดังนั้นฉันจึงทำเครื่องหมาย Name คุณสมบัติเป็นคีย์หลัก
ในการใช้งานกับหน่วยงานของประเทศที่คุณต้องการในตอนแรกเพื่อสร้างคลาส DataContext ที่ได้รับ ประการที่สองคุณต้องประกาศคุณสมบัติ DbSet<TEntity> ในคลาสที่ได้มาซึ่ง TENTITY - ประเภทของเอนทิตีที่คุณต้องการจัดเก็บในฐานข้อมูล ฉันได้ประกาศคลาส TestDataContext ตามกฎที่กล่าวถึง Class TestDataContext มี Countries อสังหาริมทรัพย์สาธารณะเพียงแห่งเดียว
นอกจากนี้ฉันยังได้ประกาศ constuctor แบบไม่มีพารามิเตอร์สาธารณะซึ่งเรียกตัวสร้างที่มีข้อมูลรับรองความปลอดภัยดังนั้นการใช้ UniversityInfodataconText จะสะดวกมาก
internal class UniversityInfoDataContext : DataContext
{
public TestDataContext ( ) : base ( "SAMPLES" , "TestUser" , "testpassword" ) { }
public DbSet < Country > Countries { get ; set ; }
} ในการจัดการข้อมูลคุณสามารถใช้วิธีการต่าง ๆ ของ DbSet<TEntity> ซึ่งอธิบายไว้ในส่วนก่อนหน้า โปรดทราบว่าการเปลี่ยนแปลงทุกครั้งที่ใช้เฉพาะเมื่อมีการเรียกใช้วิธีการของบริบท SubmitChanges เท่านั้น
ตัวอย่างเช่นการสร้างนิติบุคคลใหม่ในฐานข้อมูลนั้นง่ายมาก:
internal static void InsertCountry ( Country entity )
{
using ( var context = new UniversityInfoDataContext ( ) )
{
context . Countries . InsertOnSubmit ( entity ) ;
context . SubmitChanges ( ) ;
}
}นอกจากนี้คุณสามารถใช้แบบสอบถาม LINQ เพื่อรับข้อมูลจากฐานข้อมูล ตัวอย่างเช่นคุณสามารถรับทุกประเทศที่มีมากกว่าหนึ่งเมือง:
internal static List < Country > InsertCountry ( Country entity )
{
using ( var context = new UniversityInfoDataContext ( ) )
{
return context . Countries . Where ( country => country . Towns . Count > 1 ) . ToList ( ) ;
}
}