这篇博客将介绍如何使用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关系就建立了。

感谢您的阅读。

[LINQ TO SQL]使用LINQ TO SQL创建数据库的更多相关文章

  1. ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段

    ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...

  2. Sql语句在SqlServer中创建数据库、表格并添加约束

    通过Sql语句来创建数据库与架构 创建数据库 数据库的创建首先是要引用主数据库的,需要在master数据库的环境下进行创建.大致的语法如下: -- 使用master数据库 use master -- ...

  3. PL/SQL Developer图形化窗口创建数据库(表空间和用户)以及相关查询sql

    前言:上一篇安装好oracle和pl/sql后,这篇主要讲如何创建数据库,因为接下来我的项目会连接数据库进行开发. 第一步.先用系统管理员登录pl/sql 我这里系统管理员用户名为system,密码为 ...

  4. 必须会的SQL语句(一) 创建数据库与删除数据库

    1.创建数据库   Create database 名称 on primary {    name ='名称',    filename ='c:\xx\名称.mdf',    size = 10mb ...

  5. 【SQL server基础】手动创建数据库和表格

    use master go if exists(select * from sysdatabases where name='learning') drop database learning go ...

  6. sql server2008中怎样用sql语句创建数据库和数据表

    这是简单用代码实现创建数据库和数据表的sql语句,如下: --调用系统数据库-- use master go /***防止你要创建的数据库同名,先把它删除掉****/ if Exists(select ...

  7. 使用动态SQL创建数据库

    /*其实我也搞不懂为什么要用SQL来创建,明明SQL Server有图形化创建数据库多省事啊!*/USE master; ​DECLARE @sqlstr nvarchar(max)/*定义一个变量* ...

  8. C# 读取文件中的sql语句 创建数据库以及表结构

    大概思路是: 读取文件 根据文件中行内容为GO 作为分割  一条条放到list中 然后在程序中逐条执行sql语句; 值得一提的是 创建数据库的语句是不允许放到程序事务中执行的 所以目前我是分了两个文本 ...

  9. Mysql常用sql语句(一)- 操作数据库

    21篇测试必备的Mysql常用sql语句,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1683347.html ...

随机推荐

  1. Swift中类与结构的初始化

    前言:通过学习与研究swift3.0的官方文档关于初始化这部分可以总结为一句话:类与结构是确保一个类型的实例可以使用之前,其所有存储属性都得到了正确的赋值. 一,结构的初始化1 struct Firs ...

  2. 常用HTTP状态码和CURL 000问题

      最近在测试CDN服务质量问题,测试过程中返回了一些不同的状态码,当然有一些常用的,也有一些不常用的.最奇葩的是在使用curl命令的时候出现000状态码,问了很多同事,对这个000的反应跟新事物是的 ...

  3. php扩展memcached和memcache的安装配置方法:转载

    本文转载:http://www.jb51.net/article/56999.htm php连接memcached缓存服务器的客户端有两个,一个是memcache是比较底层的开发库,memcached ...

  4. 同步(Synchronous)和异步(Asynchronous)

    目录 概念性 图示例 举个例子 回到顶部 概念性 同步和异步通常用来形容一次方法调用. 同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为. 异步方法调用更像一个消息传递,一旦开始 ...

  5. ELK 集中日志分析 windows部署实战

    一步步来 1.下载软件 Elasticsearch: https://download.elasticsearch.org/...p/elasticsearch/2.0.0/elasticsearch ...

  6. Postgresql 简单配置 (ubuntu server 14.04.3)

    安装和配置 ubuntu server 已经自动安装了progresql,故安装步骤就省略 初始postgresql没有密码,不能使用,需要先设置密码,命令(从网上随意找的)如下: sudo su p ...

  7. jcFeather For Arnold

    jcFeather 现在可以支持Arnold了,可以用Arnold来贴图方式渲染jcFeather的刷出的多边形羽毛. jcFeather 自带笔刷刷羽毛多边形,再配上一个Arnold shader ...

  8. Java Web ——http协议响应报文

    HTTP 响应报文 HTTP 响应报文由状态行.响应头部.空行 和 响应包体 4 个部分组成,如下图所示: 下面对响应报文格式进行简单的分析: 状态行:状态行由 HTTP 协议版本字段.状态码和状态码 ...

  9. 轻松搞定laravel的curd操作搞定简易留言版(四)

    一:目的开发laravel简易留言板 二:路由操作routes.php <?php //GET /msg/index 展示留言列表 //GET /msg/add 展示表单 //POST /msg ...

  10. poi2015 bzoj4377-4386训练

    就按时间顺序写吧 完成度:10/10 3.30 bzoj4385 首先一定是删去连续d个数,然后枚举终点,起点显然有单调性,用单调队列乱搞搞就可以啦 bzoj4378 首先才结论:可行当且仅当把所有大 ...