OpenAccess类之间的关联

导读:本文以实际操作为例,介绍在OpenAccess的编辑器中,如何建立两个类之间的关联。我在这里继续以Oracle为实例数据库。

创建数据库和表

 SQL Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE TABLE "Person"
(
    
"PersonId" RAW (16),
    
"PersonName" VARCHAR2 (36NOT NULL,
    
PRIMARY KEY ("PersonId")
);
CREATE TABLE "Child"
(
    
"ChildId" RAW (16),
    
"PersonId" RAW (16NOT NULL,
    
"ChildName" VARCHAR2 (20NOT NULL,
    
PRIMARY KEY ("ChildId")
);
CREATE TABLE "Worker"
(
    
"PersonId" RAW (16),
    
"Department" VARCHAR2 (20NOT NULL,
    
PRIMARY KEY ("PersonId")
);

创建项目

  数据库创建后,根据OpenAccess基本操作介绍的方法创建项目,然后打开EntitiesModel.rlinq

1对多关系

  在工具箱中选择Association,从Child连线到Person,编辑器会弹出对话框。

 

  选择Child.PersonId关联到Person.PersonId,然后点击OK关闭对话框。

 

  这样,Child和Person之间的1对多关联就建立了。可以看见编辑器为Person类添加了一个Children属性,为Child类添加了一个Person属性。

 

  最后,可以在程序中使用这两个属性,访问被关联的对象。

 C# Code 
1
2
3
4
Sunny.Model.EntitiesModel model = new Model.EntitiesModel();
foreach(Sunny.Model.Person person in model.People)
    
foreach (Sunny.Model.Child child in person.Children)
        System.Console.Write(
"Parent Name:{0} Child Name:{1}"child.Person.PersonName, child.ChildName);

1对1关系

  在工具箱中选择Association,从Child连线到Person,编辑器会弹出对话框。

 

  选择Worker.PersonId关联到Person.PersonId,然后点击OK关闭对话框。

 

  这样,Worker和Person之间的1对1关联就建立了。可以看见编辑器为Person类添加了一个Worker属性,为Worker类添加了一个Person属性。

 

  最后,可以在程序中使用这两个属性,访问被关联的对象。

 C# Code 
1
2
3
4
5
Sunny.Model.EntitiesModel model = new Model.EntitiesModel();
foreach (Sunny.Model.Person person in model.People)
    System.Console.Write(
"Person:{0} Department:{1}", person.PersonName, person.Worker == null ? "" : person.Worker.Department);
foreach (Sunny.Model.Worker worker in model.Workers)
    System.Console.Write(
"Person:{0} Department:{1}", worker.Person.PersonName, worker.Department);

  在OpenAccess里,强制规定主键和主键之间的关联是1对1,其他字段和主键的关联是1对多,并且目标类(Taget Class)中的关联字段必须是主键。这种强制不能更改的硬性规则,我自己感觉上不知道会不会有失灵活性。

  除了1对n关联外,OpenAccess还有一种通过中间表关联两个类的多对多关联方式,可以在上面提及的“关联编辑器(Association Editor)”窗口中的“关系视图(Relational View)”选项卡中作这种多对多关联的设置。这里为了保持本文的简洁性不作详述,有兴趣可以自己尝试体会。

继承

  对于Perosn和Worker来说,通过继承来关联,似乎是比1对1关联更加合理的选择。下面演示操作步骤:

 

  首先,删除Worker的PersonId属性,在工具箱中选择Inheritance,从Child连线到Person。

 

  接着在“映射明细编辑器(Mapping Details Editor)”中,选择“继承策略(Inheritance Strategy)”为“纵向(Vertical)”

  除了Vertical,OpenAccess还有Flat和Horizontal两种继承方式。Flat表示派生类和基类都存储在同一张表,Horizontal表示最顶层的基类没有映射到数据库中的任何表。由于这两种继承方式比较少用到,本文不作详述,有兴趣可以的话可以自己尝试一下。

 

  如果Worker没有映射到表,重新选择映射到Worker。

  不知道是不是OpenAccess的Bug,每次建立继承关联的时候,派生类的映射表都会被清空。

 

  最后在属性窗口中,把Worker的Concurrency Mode属性设为Default。

  不这样设的话操作数据库的时候会出错,至于为什么会这样这里就不作详述了,有兴趣可以自己探索一下。

 

  这样,两个类之间的继承关联就设置完毕了。如果在程序中使Worker对象往数据库中添加数据,OpenAccess会同时在Person和Worker两张表中添加数据。

 C# Code 
1
2
3
4
5
6
7
Sunny.Model.EntitiesModel model = new Model.EntitiesModel();
Sunny.Model.Worker worker = 
new Model.Worker();
worker.PersonId = System.Guid.NewGuid();
worker.PersonName = 
"Sunny";
worker.Department = 
"Development";
model.Add(worker);
model.SaveChanges();
Advertisements