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

欢迎查阅
OBASE帮助文档

配置简单属性

在实体型配置上使用Attribute方法即可得到简单属性配置,下面我们逐一介绍属性配置的API。

  • HasCombinationHandler 设置属性合并的方式,此方法有两个重载。
HasCombinationHandler(eAttributeCombinationHandlingStrategy strategy)
HasCombinationHandler(IAttributeCombinationHandler combiner)

两个方法返回值均为属性配置项,可以继续配置其他属性选项。 第一个方法接受一个枚举参数,用于指定此类发生并发冲突时的策略,并根据策略指定此属性进行合并时使用的合并方式。 第二个方法接受一个接口参数,用于实现自定义的合并处理方式。 此部分的详细内容将在乐观并发模型内介绍。

  • HasMappingConnectionChar 配置映射连接字符,此方法有一个重载。
HasMappingConnectionChar(char value)

此返回值均为属性配置项,可以继续配置其他属性选项。 此方法为配置复杂类型属性时使用的,对于一般的简单属性不生效,接收参数为单个字符,此部分内容将在下面配置复杂类型节内介绍。

  • HasValueGetter 设置属性的取值器,此方法有九个重载。
HasValueGetter(IValueGetter valueGetter)
HasValueGetter<TProperty>(Func<TStructural, TProperty> getValue)
HasValueGetter<TProperty>(Func<TStructural, IEnumerable<TProperty>> getValue)
HasValueGetter(MethodInfo method)
HasValueGetter(PropertyInfo property)
HasValueGetter(FieldInfo field)
HasValueGetter(string memberName, MemberTypes memberType)
HasValueGetter<TProperty>(MemberTypes memberType)
HasValueGetter<TProperty>()  

这些方法的返回值均为属性配置项,可以继续配置其他属性选项。 取值器是从属性中取值的方法,即使用属性的Get方法获取值。 第一个方法接受IValueGetter接口参数,可实现自定义的取值方法。 第二个方法接受表达式,指定此属性配置从类的哪个属性取值,此方法仅能配置多重性为0,1的属性。 第三个方法指定此属性配置从类的哪个属性取值,此方法仅能配置多重性为0,*的属性。 第四个至第六个方法接受反射获取的方法信息,属性信息或者字段信息,并从他们相应的内容取值。 第七个方法接受成员的名称,并根据成员类型反射获取其方法信息,属性信息或者字段信息从其中取值。 第八个方法接受泛型参数,并根据成员类型和泛型参数类型反射获取其方法信息,属性信息或者字段信息从其中取值。 第九个方法接受泛型参数,按照字段反射获取其字段信息从其中取值。

  • HasValueSetter 设置属性的设值器,共有十一个重载。
HasValueSetter<TProperty>(Expression<Func<TStructural, TProperty>> expression)
HasValueSetter<TProperty, TElement>(Expression<Func<TStructural, TProperty>> propertyExp,Func<IEnumerable<TElement>, TProperty> valueCreator)
HasValueSetter<TValue>(Action<TStructural, TValue> setValue, eValueSettingMode mode)
HasValueSetter<TValue, TElement>(Action<TStructural, TValue> setValue,Func<IEnumerable<TElement>, TValue> valueCreator)
HasValueSetter(IValueSetter valueSetter)
HasValueSetter(MethodInfo method, eValueSettingMode mode)
HasValueSetter(PropertyInfo property)
HasValueSetter(FieldInfo field)
HasValueSetter(string memberName, MemberTypes memberType)
HasValueSetter<TProperty>(MemberTypes memberType)
HasValueSetter<TProperty>()

这些方法的返回值均为属性配置项,可以继续配置其他属性选项。 设值器是为属性设值的方法,即使用属性的Set方法设置值。 第一个方法接受一个表达式表示属性的委托,将指定的属性设置为当前属性配置的设值器。 第二个方法接受表达式表示属性的委托和用于创建元素的委托,根据这两个委托构造此属性配置的设值器。 第三个方法接受一个设值方法委托和设值模式枚举,委托指示如何设值,枚举有两个值:赋值模式和追加模式。 第四个方法接受一个设值方法委托和用于创建元素的委托,根据这两个委托构造此属性配置的设值器。 第五个方法受IValueSetter接口参数,可实现自定义的设值方法。 第六个方法到第八个方法接受反射获取的方法信息,属性信息或者字段信息,并根据他们相应的内容设值。 第九个方法接受成员的名称,并根据成员类型反射获取其方法信息,属性信息或者字段信息为属性设值。 第十个方法接受泛型参数,并根据成员类型和泛型参数类型反射获取其方法信息,属性信息或者字段信息为属性设值。 第十一个方法接受泛型参数,按照字段反射获取其字段信息为属性设值。

  • ToField 此方法指示此属性在持久化层对应的字段,共有一个重载。
ToField(string field)

此方法返回值为属性配置项,可以继续配置其他属性选项。 此方法接受一个字符串作为参数,指定此属性的字段名称,当字段名与属性名称相同时,无需配置。

数据类型

数据类型就是Attribute方法中Type dataType参数,此参数指示存入持久化层时使用的数据类型,一如之前介绍的例子一样:你有一个属性是List< string >但数据库内是以,分割字符串,这时就应当将类型配置为string。

配置复杂类型

本节内容对应的Demo位于Obase.Test.Demo中Obase.Test/ComplexType,Obase.Test.Infrastructure/ComplexType和Obase.Test.Domain内,所使用的数据库表建表脚本(MySql版)位于Obase.Test.Infrastructure内。

有些时候,我们需要一些由多个存储字段组合而成的,比如一个地址就包含省份,城市,街道这三个属性,但又不想增加一个关系,那么我们会一般使用struct(结构体)来表示这种轻量级的“关系”。 以下为一个国内地址类和省份,城市,街道结构体。

/// <summary>
///     国内地址
/// </summary>
public class DomesticAddress
{
    /// <summary>
    ///     市
    /// </summary>
    private City _city;

    /// <summary>
    ///     详细地址
    /// </summary>
    private string _detailAdress;

    /// <summary>
    ///     地址的键
    /// </summary>
    private string _key;

    /// <summary>
    ///     省/直辖市
    /// </summary>
    private Province _province;

    /// <summary>
    ///     区/县
    /// </summary>
    private Region _region;

    /// <summary>
    ///     地址的键
    /// </summary>
    public string Key
    {
        get => _key;
        set => _key = value;
    }

    /// <summary>
    ///     省/直辖市
    /// </summary>
    public Province Province
    {
        get => _province;
        set => _province = value;
    }

    /// <summary>
    ///     市
    /// </summary>
    public City City
    {
        get => _city;
        set => _city = value;
    }

    /// <summary>
    ///     区/县
    /// </summary>
    public Region Region
    {
        get => _region;
        set => _region = value;
    }

    /// <summary>
    ///     详细地址
    /// </summary>
    public string DetailAdress
    {
        get => _detailAdress;
        set => _detailAdress = value;
    }

    /// <summary>
    ///     转换为字符串表示
    /// </summary>
    /// <returns></returns>
    public override string ToString()
    {
        return
            $"DomesticAdress:{{Key-\"{_key}\",Province-{{Name-\"{_province.Name}\",Code-{_province.Code}}},City-{{Name-\"{_city.Name}\",Code-{_city.Code}}},Region-{{Name-\"{_region.Name}\",Code-{_region.Code}}},DetailAdress-\"{_detailAdress}\"}}";
    }
}

/// <summary>
///     省级行政区划
/// </summary>
public struct Province
{
    /// <summary>
    ///     省名称
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    ///     省代码
    /// </summary>
    public int Code { get; set; }
}

/// <summary>
///     市级行政区划
/// </summary>
public struct City
{
    /// <summary>
    ///     市名称
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    ///     市代码
    /// </summary>
    public int Code { get; set; }
}

/// <summary>
///     区/县级行政区划
/// </summary>
public struct Region
{
    /// <summary>
    ///     区/县名称
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    ///     区/县代码
    /// </summary>
    public int Code { get; set; }
}

对应的MySql表如下:

CREATE TABLE `domesticaddress` (
  `Key` varchar(255) COLLATE utf8mb4_bin NOT NULL,
  `Name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
  `Code` int(255) DEFAULT NULL,
  `City_Name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
  `City_Code` int(255) DEFAULT NULL,
  `Region-Name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
  `Region-Code` int(255) DEFAULT NULL,
  `DetailAdress` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
  PRIMARY KEY (`Key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

做如下的配置即可:

//注册实体型
var domesticAdressConfig = modelBuilder.Entity<DomesticAddress>();
domesticAdressConfig.HasKeyAttribute(p => p.Key).HasKeyIsSelfIncreased(false);

//注册复杂类型
modelBuilder.Complex<Province>();
modelBuilder.Complex<City>();
modelBuilder.Complex<Region>();

//对应的属性
domesticAdressConfig.Attribute(p => p.City).HasMappingConnectionChar('_');
domesticAdressConfig.Attribute(p => p.Region).HasMappingConnectionChar('-');

这里需要注意的是使用了HasMappingConnectionChar映射字段连接符这一配置,这个配置和你的持久层设计有关,默认是不使用连接符就像“省份”这一复杂类型一样。 modelBuilder.Complex<>方法可以得到复杂类型配置,复杂类型配置可以配置自己的属性,这部分API和配置简单属性的API相同。

没有找到您需要的文档?

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

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

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