复杂属性示例
场景
我们假设有一个Student类,Student类的detailAddr属性表示学生的详细住址,它的数据类型是结构体DetailAddress是一个复杂类型 (相对于基元类型而言)。假如业务上并不需要对详细地址做结构化存储,只需要序列化以后存储在一个字段里面,如图所示,该如何处理?
解决方案
实体模型
/// <summary>
/// 学生
/// </summary>
public class Student
{
/// <summary>
/// 入学年
/// </summary>
private int _addmisionYear;
/// <summary>
/// 详细地址
/// </summary>
private DetailAddress _detailAddress;
/// <summary>
/// 学生姓名
/// </summary>
private string _name;
/// <summary>
/// 出生城市
/// </summary>
private string _nativeCity;
/// <summary>
/// 出生省份
/// </summary>
private string _nativeProvince;
/// <summary>
/// 专业
/// </summary>
private string _profession;
/// <summary>
/// 学生ID
/// </summary>
private string _studentId;
/// <summary>
/// 学生ID
/// </summary>
public string StudentId
{
get => _studentId;
set => _studentId = value;
}
/// <summary>
/// 学生姓名
/// </summary>
public string Name
{
get => _name;
set => _name = value;
}
/// <summary>
/// 入学年
/// </summary>
public int AddmisionYear
{
get => _addmisionYear;
set => _addmisionYear = value;
}
/// <summary>
/// 专业
/// </summary>
public string Profession
{
get => _profession;
set => _profession = value;
}
/// <summary>
/// 出生省份
/// </summary>
public string NativeProvince
{
get => _nativeProvince;
set => _nativeProvince = value;
}
/// <summary>
/// 出生城市
/// </summary>
public string NativeCity
{
get => _nativeCity;
set => _nativeCity = value;
}
/// <summary>
/// 详细地址
/// </summary>
public DetailAddress DetailAddress
{
get => _detailAddress;
set => _detailAddress = value;
}
}
/// <summary>
/// 详细地址
/// </summary>
public class DetailAddress
{
/// <summary>
/// 地区
/// </summary>
public string Distinct { get; set; }
/// <summary>
/// 街道
/// </summary>
public string Street { get; set; }
/// <summary>
/// 社区
/// </summary>
public string Community { get; set; }
/// <summary>
/// 房号
/// </summary>
public string HouseN
模型配置
/// <summary>
///复杂属性配置
/// </summary>
public class ComplexConfiguration : MySqlContextConfigProvider
{
/// <summary>由派生类实现,获取数据库连接字符串。</summary>
protected override string ConnectionString => Configuration.MySqlConnectionString;
/// <summary>获取一个值,该值指示是否启用存储结构映射</summary>
protected override bool EnableStructMapping => true;
/// <summary>使用指定的建模器创建对象数据模型。</summary>
/// <param name="modelBuilder"></param>
protected override void CreateModel(ModelBuilder modelBuilder)
{
//将Student配置为实体型
var studentEntity = modelBuilder.Entity<Student>();
//配置主键
studentEntity.HasKeyAttribute(p => p.StudentId).HasKeyIsSelfIncreased(false);
//对于复杂对象不进行独立存储 只需要配置映射类型 设值和取值方法
//将DetailAddress配置为string类型
studentEntity.Attribute(p => p.DetailAddress, typeof(string))
//取值器 即Obase如何从对象中取值 此处配置为将DetailAddress转换为Json字符串返回
.HasValueGetter(p => JsonConvert.SerializeObject(p.DetailAddress))
//设值器 即Obase如何为对象设置值 此处配置为将Json字符串转换为DetailAddress设值
.HasValueSetter<string>((p, value) =>
{
if (!string.IsNullOrEmpty(value))
p.DetailAddress = JsonConvert.DeserializeObject<DetailAddress>(value);
});
}
}