這篇博客將介紹如何使用LINQ TO SQL來創建數據庫,以及如何映射Table之間的主外鍵關系。
我們的數據庫表關系如下:

Province與City之間1:M,City與Area之間1:M的關系。
下面就通過LINQ TO SQL來創建這樣的數據庫,以Province表為例,
Province Table:
using System.Collections.Generic; using System.Data.Linq; using System.Data.Linq.Mapping; namespace ImportAreaInfoApp.Models { [Table(Name = "Province")] class Province { [Column(IsPrimaryKey = true, Name = "Id", IsDbGenerated = true, CanBeNull = false)] public int Id { get; set; } [Column] public string Name { get; set; } } }
1). 引用System.Data.Linq.Mapping;
2). 給Province類添加Table屬性,如果數據庫表名與類名一致,可以不設置Table的Name值,會默認使用類名作為數據表的名字;
3). 數據表中列通過Column指定,如果該列為主鍵,需要設置IsPrimaryKey=true,同樣的如果列名與字段名一致,Name可以不指定。
City Table:
using System.Collections.Generic; using System.Data.Linq; using System.Data.Linq.Mapping; namespace ImportAreaInfoApp.Models { [Table(Name = "City")] class City { [Column(IsPrimaryKey = true, Name = "Id", IsDbGenerated = true, CanBeNull = false)] public int Id { get; set; } [Column(Name = "Name")] public string Name { get; set; } } }
Area Table:
using System.Collections.Generic; using System.Data.Linq; using System.Data.Linq.Mapping; namespace ImportAreaInfoApp.Models { [Table(Name = "Area")] class Area { [Column(IsPrimaryKey = true, Name = "Id", IsDbGenerated = true, CanBeNull = false)] public int Id { get; set; } [Column(Name = "Name")] public string Name { get; set; } } }
到這里,數據表就創建完了。下面創建數據庫
using System.Data.Linq; using System.Data.Linq.Mapping; namespace ImportAreaInfoApp.Models { [Database(Name = "ExpressDb")] class ExpressDbContext : DataContext { private const string ConnectionString = @"Data Source=HW-WPF-SER\SQLEXPRESS;Initial Catalog=ExpressDb;Integrated Security=True;"; public Table<Province> Provinces; public Table<City> Cities; public Table<Area> Areas; public ExpressDbContext() : base(ConnectionString) { } } }
1). 數據庫類需要繼承DataContext,並且類名需要添加Database屬性,如果數據庫名稱與類名不一致,需要制定Name值;
2). 數據庫所關聯的表需要通過Table<Table Class> Tables指出來;
3). 在程序中我們可以通過ExpressDbContext類來操作所屬的數據表完成CRUD操作。
創建數據庫,
using (ExpressDbContext dbContext = new ExpressDbContext()) { if (dbContext.DatabaseExists()) { dbContext.DeleteDatabase(); } dbContext.CreateDatabase(); }
但是數據表之間的關系沒有映射。以Province和City為例,對City類做如下修改,
using System.Collections.Generic; using System.Data.Linq; using System.Data.Linq.Mapping; namespace ImportAreaInfoApp.Models { [Table(Name = "City")] class City { [Column(IsPrimaryKey = true, Name = "Id", IsDbGenerated = true, CanBeNull = false)] public int Id { get; set; } [Column(Name = "Name")] public string Name { get; set; } [Column(Name = "Province")] private int? _provinceId; private EntityRef<Province> _province = new EntityRef<Province>(); [Association(Name = "FK_City_Province", IsForeignKey = true, Storage = "_province", ThisKey = "_provinceId")] public Province Province { get { return _province.Entity; } set { _province.Entity = value; } } } }
1). 創建一個int?型的私有變量來保存ProvinceId;
2). 創建EntityRef<Province>私有變量來保存City關聯的Province;
3). 通過Association來標識關聯性;
相應的,對Province類也要做修改,
using System.Collections.Generic; using System.Data.Linq; using System.Data.Linq.Mapping; namespace ImportAreaInfoApp.Models { [Table(Name = "Province")] class Province { [Column(IsPrimaryKey = true, Name = "Id", IsDbGenerated = true, CanBeNull = false)] public int Id { get; set; } [Column] public string Name { get; set; } private EntitySet<City> _cities = new EntitySet<City>(); [Association(Name= "FK_City_Province", Storage = "_cities", OtherKey = "_provinceId", ThisKey = "Id")] public ICollection<City> Cities { get { return _cities; } set { _cities.Assign(value); } } } }
1). 添加EntitySet<City>私有變量來持有Province相關聯的City;
2). 通過Association來完成外鍵關系匹配;
經過上述代碼的修改Province與City之間的1:M關系就建立了。
感謝您的閱讀。
