Skip to main content

配置属性

模型中的每个实体类型都有一组属性,Obase将从数据库中读取和写入这些属性。如果使用的是关系数据库,实体属性将映射到表列。

已包含和已排除的属性

按照约定,所有具有 Getter 和 Setter 的公共属性都将包含在模型中。 可以按如下所示排除特定属性:

public class Student{
public int UserId { get; set; }
public string Username { get; set; }
[Ignore]
public string Address {get;set;}
}

列名

按照约定,使用关系数据库时,实体属性将映射到与属性同名的表列。 如果希望配置具有不同名称的列,可以按以下代码片段进行操作:

public class Student{
public int UserId { get; set; }
public string Username { get; set; }
[TypeAttribute("Address")]
public string Address {get;set;}
}

隐式关联标注

public class Student{
public int UserId { get; set; }
public string Username { get; set; }
[ImplicitAssociation("Student")]
[LeftEndMapping("UserId","UserId")]
[RightEndMapping("SchoolId", "SchoolId")]
public virtual School School{get;set;}
}

显式关联标注

标注为显式关联引用

public class Class
{
/// <summary>
/// 班级id
/// </summary>
public long ClassId {get;set;}

/// <summary>
/// 班级任课老师
/// </summary>
private List<ClassTeacher> _classTeachers;

/// <summary>
/// 任课教师
/// </summary>
[AssociationReference]
public virtual List<ClassTeacher> ClassTeachers
{
get => _classTeachers;
set => _classTeachers = value;
}
}

标记为显示关联端

 public class ClassTeacher
{
/// <summary>
/// 班级
/// </summary>
private Class _class;

/// <summary>
/// 班级ID
/// </summary>
private long _classId;

/// <summary>
/// 教师
/// </summary>
private Teacher _teacher;

/// <summary>
/// 教师ID
/// </summary>
private long _teacherId;

/// <summary>
/// 班级ID
/// </summary>
public long ClassId
{
get => _classId > 0 ? _classId : Class?.ClassId ?? 0;
set => _classId = value;
}

/// <summary>
/// 班级
/// </summary>
[AssociationEnd]
[EndMapping("ClassId", "ClassId")]
public virtual Class Class
{
get => _class;
set => _class = value;
}

/// <summary>
/// 教师ID
/// </summary>
public long TeacherId
{
get => _teacherId > 0 ? _teacherId : Teacher?.TeacherId ?? 0;
set => _teacherId = value;
}

/// <summary>
/// 教师
/// </summary>
[AssociationEnd]
[EndMapping("TeacherId","TeacherId")]
public virtual Teacher Teacher
{
get => _teacher;
set => _teacher = value;
}
}

取值器

当Obase持久化数据时,它会调用取值器。以下示例配置显示Name的值,同时附加上当前时间:

protected override void CreateModel(ModelBuilder modelBuilder)
{
modelConfig.Attribute(c => c.Name).HasValueGetter(model =>
{
return "我是取值器_" + model.Name;
});
}

var model = new Student
{
Age = 18,
Name = @"Obase"
};
//构造上下文
var context = new DbContext();
context.Students.Attach(model);
context.SaveChanges();

数据库存储的值是“我是取值器_Obase”。

设值器

设值器是与取值器相对应的,当Obase从数据库中读取数据并为对象实例赋值时,它会调用设值器。以下代码演示了如何为Name属性添加一个设值器:

protected override void CreateModel(ModelBuilder modelBuilder)
{
var modelConfig = modelBuilder.Entity<Student>();
modelConfig.Attribute(c => c.Name).HasValueSetter<string>(
(model, s) =>
{
model.Name = "我是设值器_" + s;
});
}

var context = new DbContext();
context.Students.ToList().ForEach(c => Console.WriteLine(c.Name));

假设数据库中存在一条Name为Obase的数据,那么输出结果将会是:我是设值器_Obase。

数据库类型映射

Obase统一将一些语言内置类型定义为Obase基元类型,因此在将这些基元类型作为属性或反持久化构造函数参数时,如果数据库类型为默认映射,无需进行额外的配置。

.Net版本

Obase基元类型为系统基元类型+string(字符串)类型+decimal(精确十进制数)+datetime(日期时间)+timespan(时间) +guid +枚举

Obase基元类型MySql数据类型Sqlite数据类型
booltinyint,intINTEGER
byte/sbytetinyint,intINTEGER
charchar,varcharTEXT
DateTimedatetime,dateTEXT
decimaldecimalREAL(可能有损)
doubledouble,decimalREAL
Enumtinyint,intINTEGER
floatfloat,decimalREAL
guidvarchar,text,longtextTEXT
int/uintint,bigintINTEGER
long/ulongbigintINTEGER
short/ushortsmallint,intINTEGER
Stringvarchar,text,longtextTEXT
TimeSpantimeTEXT

Java版本

Obase基元类型为系统基元类型+基元类型的包装类+string(字符串)类型+bigdecimal(精确十进制数)+ date(早期版本日期时间)+ localdate(本地日期)+localdatetime(本地日期时间)+localtime(本地时间) + uuid+枚举

Obase基元类型MySql数据类型Sqlite数据类型
bigdecimaldecimalREAL(可能有损)
booleantinyint,intINTEGER
bytetinyint,intINTEGER
charchar,varcharTEXT
datedatetimeTEXT
doubledouble,decimalREAL
Enumtinyint,intINTEGER
floatfloat,decimalREAL
intint,bigintINTEGER
longbigintINTEGER
localdatetimedatetimeTEXT
localdatedateTEXT
localTimetimeTEXT
shortsmallint,intINTEGER
Stringvarchar,text,longtextTEXT
uuidvarchar,text,longtextTEXT

最大长度

目前字符串类型的长度默认为255,其他类型则使用默认的长度和精度。