obase社区Obase开发者QQ群:962698871
obase

欢迎查阅
OBASE帮助文档

一个类型与另一个或几个类型的对象之间往往存在着概念上的、持续的特定关系,如老师与班级之间的“教学”关系,团队和成员之间的“隶属”关系,班级、老师和教室三者之间“上课”关系,这种关系称为关联。特别地,一个类型的对象也会与本类型的其它对象产生关联,如行政区域之间存在“上下级”关系(省与市、市与区等),人与人之间可构成夫妻或家庭关系,这种关联称为自关联。

特别说明 一般情况下,我们在抽象的意义上使用“关联”这个概念,比如说老师与班级之间的“教学”关联,但不明确具体是哪个老师、哪个班级。有时,我们也会在具体的意义上使用“关联”概念,比如说某一老师(对象)与某一班级(对象)之间存在“教学”关联,需要强调时我们通常将这个意义上的关联称为“关联实例”,就如同我们有时会称“对象”为类的实例。

Obase用“关联型”这一概念来描述面向对象模型中的关联。之所以称为关联型而不称为关联,即是为了强调其所描述的是抽象意义上的关联。

如同对象一样,关联也可能具有属性,如老师与班级之间的“教学”关联,需要一个属性来指示老师是否为班主任。这个属性不能定义为老师的属性,因为一个老师是某个班级的班主任但不会是所有班级的班主任,脱离某一特定班级来谈论一个老师是否为班主任是没有意义的,也就是说“是否班主任”这个属性是属于关联的属性。只对关联有意义,而对关联的参与方(对象)没有意义的属性,称为关联属性。 在面向对象模型中,如果一个关联具有关联属性,通常会定义一个类(称为关联类)来表示这个关联,这种关联为显式关联。反之,如果一个关联没有对应的关联类,只是一种逻辑上的存在,则为隐式关联。

对于配置关联型我们已经很熟悉了,使用ModelBuilder的Association<>方法即可得到关联型的配置,下面我们逐一介绍关联型配置的API。

  • AssociationEnd 配置一个关联端,此方法有三个重载。
AssociationEnd(string name, Type entityType)
AssociationEnd<TResult>(Expression<Func<TAssociation, TResult>> expression) 
AssociationEnd<TEnd>(string name) 

这三个方法的返回值都是关联端配置,关于关联端配置将在配置关联端一节详细介绍。 第一个方法接受关联端的名称和关联端的类型作为参数,此方法为手动配置关联端,仅使用传入名称和类型创建关联端配置,不检查参数类型,不创建取值器和设值器。 第二个方法接受一个表达式表示的委托,会根据表达式解析关联端名称和类型,会自动创建取值器和设值器。 第三个方法接受关联端的名称和关联端类型的泛型参数创建关联端配置,会自动创建取值器和设值器。

  • Attribute ,此方法用于配置属性,共有四个重载:
Attribute(string name, Type dataType);
Attribute(string name);
Attribute<TResult>(Expression<Func<TStructural, TResult>> expression);
Attribute<TResult>(Expression<Func<TStructural, TResult>> expression,Type dataType);

这四个方法的返回值都是属性配置,关于属性配置将在配置属性一节详细介绍。 第一个方法是手动配置方法,此方法仅在Obase中注册一个关属性的配置项,不配置设值器和取值器,也不会检查传入的参数。此方法的两个参数分别为属性的名称和属性在Obase中的类型,此类型会被映射为数据库的字段类型,如你有一个属性是List< string >但数据库内是以,分割字符串,这时就应当将类型配置为string,并为这个属性配置特殊的设值器和取值器。 第二个方法是自动配置方法,参数为要配置的属性访问器名称,会根据取到的属性访问器自动配置类型和取值器设值器。 第三个方法是自动配置方法,参数为用表达式表示的委托,会根据取到的属性访问器自动配置类型和取值器设值器。 第四个方法是指定类型配置方法,参数为用表达式表示的委托和类型,会将属性的类型配置为你指定的类型,并根据取到的属性访问器自动配置取值器设值器。

  • HasConcurrentConflictHandlingStrategy 设置并发策略,只有一个重载。
HasConcurrentConflictHandlingStrategy(eConcurrentConflictHandlingStrategy strategy);

此方法返回值为关联型配置项,可以继续配置其他关联型选项。 此方法接受一个枚举参数,用于指定此类发生并发冲突时的策略,关于并发冲突会在之后的乐观并发模型内详细介绍。

  • HasConstructor 设置关联型的构造器,此方法有六个重载。
HasConstructor(ConstructorInfo constructorInfo);
HasConstructor(Func<TStructural> construct);
HasConstructor<T>(Func<T, TStructural> construct);
HasConstructor<T1, T2>(Func<T1, T2, TStructural> construct);
HasConstructor<T1, T2, T3>(Func<T1, T2, T3, TStructural> construct);
HasConstructor<T1, T2, T3, T4>(Func<T1, T2, T3, T4, TStructural> construct);

这六个重载可以分为两类,即使用ConstructorInfo作为参数和使用委托作为参数的,他们的返回值都是构造函数参数配置,关于此类型的配置会在配置构造函数一节详细介绍。 第一个方法接受一个ConstructorInfo作为参数,此参数即为反射获取的构造函数信息。 第二到第六个函数接受一个委托参数,他们有从1到5个不等的泛型参数,这些参数中最后一个参数为构造函数的返回值类型,其余参数为构造函数的参数类型。

  • HasNoticeAttributes 设置关联型的通知属性,此方法有一个重载。
HasNoticeAttributes(List<string> noticeAttributes);

此方法的返回值是关联型配置项,可以继续配置其他关联型选项。 此方法接受的参数是一个字符串列表,里面的每个值指示了在发送变更通知时会被发送的属性。 变更通知的详细内容会在之后的更改通知章节内介绍。

  • HasNotifyCreation 设置在创建此实体时是否发送通知,此方法有一个重载。
HasNotifyCreation(bool notifyCreation)

此方法的返回值是关联型配置项,可以继续配置其他关联型选项。 此方法接受的参数为是否进行通知。 变更通知的详细内容会在之后的更改通知章节内介绍。

  • HasNotifyDeletion 设置在删除此实体时是否发送通知,此方法有一个重载。
HasNotifyDeletion(bool notifyCreation)

此方法的返回值是关联型配置项,可以继续配置其他关联型选项。 此方法接受的参数为是否进行通知。 变更通知的详细内容会在之后的更改通知章节内介绍。

  • HasNotifyUpdate 设置在修改此实体时是否发送通知,此方法有一个重载。
HasNotifyUpdate(bool notifyCreation)

此方法的返回值是关联型配置项,可以继续配置其他关联型选项。 此方法接受的参数为是否进行通知。 变更通知的详细内容会在之后的更改通知章节内介绍。

  • HasVersionAttribute 设置版本键属性,每调用一次追加一个版本键,此方法有两个重载。
HasVersionAttribute<TAttribute>(Expression<Func<TObject, TAttribute>> expression)
HasVersionAttribute(string attribute)

此方法的返回值是关联型配置项,可以继续配置其他关联型选项。 第一个方法接受一个表达式表示的委托,将指示的属性配置为版本键属性。 第二个方法接受属性名称,将指示的属性配置为版本键属性。 版本键属性用于处理并发冲突,将在之后的乐观并发模型内详细介绍。

  • Ignore 忽略某个属性,此方法有一个重载。
Ignore<TResult>(Expression<Func<TStructural, TResult>> expression)

此方法无返回值。 此方法接受一个表达式表示的委托,指示目标属性被Obase模型忽略。

  • HasVisible,此方法用于配置关联型的显式还是隐式,共有一个重载。
HasVisible(bool visible)

此方法返回值为关联型配置,可以继续配置其他部分。 此方法接受一个参数,用于指示关联型是显式还是隐式,一般可由Obase自动配置。

  • ToTable 设置映射表,共有一个重载。
ToTable(string table)

此方法的返回值是关联型配置项,可以继续配置其他关联型选项。 此方法接受映射表名作为参数,当映射表名与类名相同时,可以不进行配置。

没有找到您需要的文档?

您还可以通过人工服务在线咨询,服务时间为每天上午9点至下午6点。

If you can't find required answer, get in touch with us online. We provide service from 9:00 to 18:00.

让编程成为一件快乐的事
现在开始