OpenAccess常见问题

导读:本文以我自己个人的实际使用方式和经历,列举一些常遇到的问题的解决方案。我在这里继续以Oracle为实例数据库。

创建数据库和表

 SQL Code 
1
2
3
4
5
6
7
CREATE TABLE "Person"
(
    
"PersonId" NUMBER (100NOT NULL,
    
"PersonName" VARCHAR2 (36NOT NULL,
    
"Type" NUMBER (10NOT NULL,
    
PRIMARY KEY ("PersonId")
);

创建项目

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

常见问题汇总

字段的默认值

  在程序中指定属性默认值的最简单方式是在构造函数中给对应的属性赋相应的值。

 C# Code 
1
2
3
4
5
6
7
8
9
10
namespace Sunny.Model
{
    partial 
class Person
    {
        
public Person()
        {
            
this.PersonName = "Sunny";
        }
    }
}
自增主键

  在Oracle里,一般是通过触发器,使流水号插入主键值。具体操作步骤是:首先,在数据库中创建触序列(Sequence)和触发器。

 SQL Code 
1
2
3
4
5
6
7
8
/*创建序列*/
CREATE SEQUENCE "PersonId" MINVALUE 1 MAXVALUE 999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE;
/*创建触发器*/
CREATE
OR REPLACE TRIGGER "Trigger_Person_Insert" BEFORE INSERT ON "Person" REFERENCING OLD AS "OLD" NEW AS "NEW" FOR EACH ROW
BEGIN
    
SELECT "PersonId".nextval INTO : NEW ."PersonId" FROM dual ;
END;

  然后在Person的属性窗口中,把Identity Mechanism属性设置成DatabaseServerCalculated。

  这样一来,当对象插入到数据库后,就可以通过Person.PersonId属性获取对象的主键值。如果你不需要在这个时候获取这个主键值,也可以不设置Identity Mechanism属性。

  如果你希望在对象插入到数据库之前获取主键值,那么只能在对象插入到数据库前,通过调用序列(Sequence)获取。

  OpenAccess没有对Sequence进行映射封装的机制,只能之前通过Sql获取。

 C# Code 
1
2
3
Sunny.Model.EntitiesModel model = new Sunny.Model.EntitiesModel();
Sunny.Model.Person person = 
new Model.Person();
person.PersonId = model.ExecuteScalar<
int>("SELECT \"PersonId\".nextval FROM dual");
枚举映射

  在Oracle中,字段类型Number是映射到C#中的decimal类型的,但也可以映射到枚举类型。以下介绍操作步骤:

  首先,定义一个枚举。

 C# Code 
1
2
3
4
5
6
7
8
namespace Sunny.Model
{
    
public enum PersonType
    {
        Worker,
        Farmer
    }
}

  然后设置Person中Type的类型为刚刚定义的属性PersonType。

  最后我们可以通过枚举类型查询数据库。

 C# Code 
1
2
3
4
Sunny.Model.EntitiesModel model = new Sunny.Model.EntitiesModel();
foreach (Sunny.Model.Person farmer in model.People.Where(p => p.Type == Sunny.Model.PersonType.Farmer))
{
}
Oracle.DataAccess.dll版本问题

  OpenAccess默认是使用Oracle 10g的Oracle.DataAccess.dll操作数据库的,但实际上也可以使用更高版本(例如是11g)的Oracle.DataAccess.dll来操作数据库。

  具体操作步骤是在项目中引用11g的Oracle.DataAccess.dll后,在web.config或app.config中增加system.data节点指定Oracle.DataAccess.dll的版本。

 XML Code 
1
2
3
4
5
6
7
<configuration>
  
<system.data>
    
<DbProviderFactories>
      
<add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.DataAccess.Client.OracleClientFactory,Oracle.DataAccess,Version=2.112.3.0,Culture=neutral,PublicKeyToken=89b483f429c47342"/>
    
</DbProviderFactories>
  
</system.data>
</configuration>
Advertisements

4 thoughts on “OpenAccess常见问题

评论已关闭。