[LINQ TO SQL]使用LINQ TO SQL創建數據庫


這篇博客將介紹如何使用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關系就建立了。

感謝您的閱讀。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM