对象关系设计器(O/R 设计器)的作用:
1. 提供了一个可视化设计图面,用于创建基于数据库中对象的 LINQ to SQL 实体类和关系;创建映射到数据库中的对象的对象模型。
2. 生成一个强类型 DataContext,用于在实体类与数据库之间发送和接收数据。
3. 可以将存储过程和函数映射到 DataContext 方法以便返回数据和填充实体类。
4. 提供了对实体类之间的继承关系进行设计的能力。
对象关系设计器(O/R 设计器)是什么?
—— 是个 LINQ to SQL 类和数据库对象之间提供映射的 XX.dbml 文件,这个文件里有什么呢?——类型化的 DataContext 和实体类。
—— 有两个不同的区域:左侧的实体窗格和右侧的方法窗格。
打开 O/R 设计器
1. 在项目中添加新的“LINQ to SQL 类”项
2. 说明:
a. O/R 设计器是一个简单的对象关系映射器,因为它仅支持 1:1 映射关系,
b. 是一个单向代码生成器,这表示代码文件中只反映对设计器图面所做的更改,O/R 设计器中不会反映对代码文件的手动更改。
c. 在保存设计器并重新生成代码时,将覆盖在代码文件中手动进行的所有更改
创建和配置 DataContext
在向项目中添加“LINQ to SQL 类”项并打开 O/R 设计器后,空设计图面表示一个可供配置的空 DataContext。DataContext 是使用拖动到设计图面上的第一项所提供的连接信息进行配置的.
1. DataContext 类是一个 LINQ to SQL 类,它充当 SQL Server 数据库与映射到该数据库的 LINQ to SQL 实体类之间的管道,DataContext 类包含用于连接数据库以及操作数据库数据的连接字符串信息和方法。
创建映射到数据库表和视图的实体类
1. Entity 映射到数据库表和视图的 LINQ to SQL 类称为“实体类”。实体类映射到记录,而实体类的各个属性则映射到构成一条记录的各个列
2. 实体类与数据库表或视图之间只能具有 1:1 映射关系。不支持复杂映射(例如,将一个实体类映射到多个表)。但是,可以将一个实体类映射到一个联接多个相关表的视图。
3. 通过将表或视图从“服务器资源管理器”/“数据库资源管理器”拖动到 O/R 设计器上,除了可以创建用于执行更新的 DataContext 方法以外,还可以创建实体类。
LINQ to SQL 对象模型 :
1. 在 LINQ to SQL 中,用开发人员所用的编程语言表示的对象模型映射到关系数据库的数据模型。然后就会按照对象模型来执行对数据的操作。
下表概括了 LINQ to SQL 对象模型中最基本的元素及其与关系数据模型中的元素的关系:
LINQ to SQL 实体类与数据库表 (基于属性的映射 (LINQ to SQL))
在 LINQ to SQL 中,数据库表由实体类表示。实体类与您可能创建的任何其他类相似,只不过对实体类进行批注的方法是使用将该类与数据库表关联的特殊信息。您需通过向类声明中添加自定义属性 (TableAttribute) 来进行这种批注,如下面的示例所示:LINQ to SQL 仅支持单表映射关系即,实体类必须只映射到一个数据库表,且无法同时将数据库表映射到多个类。
您可以使用 TableAttribute 属性 (Attribute) 的 Name 属性 (Property) 来指定表名称,并可以选择使用架构名称来限定表名称。如果您未使用 Name 属性指定名称,则假定表名称与类名相同。
[Table(Name = "Customers")]
public class Customerzz
{
public string CustomerID;
// ...
public string City;
}
只有声明为表的类(即实体类)的实例才能保存到数据库中。
LINQ to SQL 类成员与数据库列
除了将类与表关联以外,您还需指定字段或属性来表示数据库列。为此,LINQ to SQL 定义了 ColumnAttribute 属性,如下面的示例所示:
[Table(Name = "Customers")]
public class Customer
{
[Column(IsPrimaryKey = true)]
public string CustomerID;
[Column]
public string City;
}
只有映射到列的字段和属性才能持久保存到数据库中,从数据库中也只能检索这样的字段和属性。那些未声明为列的字段和属性被视为应用程序逻辑的瞬态部分。
LINQ to SQL 关联与数据库外键关系
在 LINQ to SQL 中,数据库关联(如外键到主键关系)是通过应用 AssociationAttribute 属性表示的。在下面的代码段中,Order 类包含具有 AssociationAttribute 属性 (Attribute) 的 Customer 属性 (Property)。此属性 (Property) 及其属性 (Attribute) 为 Order 类提供了与 Customer 类的关系。
下面的代码示例显示了 Order 类中的 Customer 属性 (Property)。
[Association(Name="FK_Orders_Customers", Storage="_Customer", ThisKey="CustomerID", IsForeignKey=true)]
public Customer Customer
{
get
{
return this._Customer.Entity;
}
set
{
Customer previousValue = this._Customer.Entity;
if (((previousValue != value)
|| (this._Customer.HasLoadedOrAssignedValue == false)))
{
this.SendPropertyChanging();
if ((previousValue != null))
{
this._Customer.Entity = null;
previousValue.Orders.Remove(this);
}
this._Customer.Entity = value;
if ((value != null))
{
value.Orders.Add(this);
this._CustomerID = value.CustomerID;
}
else
{
this._CustomerID = default(string);
}
this.SendPropertyChanged("Customer");
}
}
}