Skip to main content

配置主键

主键用作每个实体实例的唯一标识符。 Obase中的大多数实体都有一个键,该键映射到关系数据库中主键的概念。

约定

对于实体型,如果没有特别配置主键,系统会尝试将类名+id、类名+code、code或id这四种属性之一配置为主键。如果只有一个主键且该主键的类型为long或int,且未配置主键自增,系统会尝试将该主键设置为自增。

配置主键

根据约定,名为 Id 或 <type name>Id 或 BikeCode 或 Code 的属性将被配置为实体的主键。 可以按如下所示排除特定属性:

internal class Car
{
public string Id { get; set; }
public string Make { get; set; }
public string Model { get; set; }
}

internal class Truck
{
public string TruckId { get; set; }
public string Make { get; set; }
public string Model { get; set; }
}

internal class Bike
{
public string BikeCode { get; set; }
public string Make { get; set; }
public string Model { get; set; }
}

internal class Train
{
public string Code { get; set; }
public string Make { get; set; }
public string Model { get; set; }
}

手动配置

也可以通过手动配置实体的主键,如下所示:

[Entity(keyAttributes:"UserId")]
public class Student{
public int UserId { get; set; }
public string Username { get; set; }
}

组合键

还可将多个属性配置为实体的键 - 这称为组合键。 约定仅在特定情况下设置复合键,例如为自有类型集合设置。

[Entity(keyAttributes:new string[] { "UserId","UserId1" })]
public class Student{
public int UserId { get; set; }
public int UserId1 { get; set; }
public string Username { get; set; }
}

任意类型的主键

Obase支持任意类型的主键,只需要主键属性配置好相应的设值器取值器和映射类型且映射类型为Obase基元类型即可:

  public class Student{
public string[] ArrarIndex { get; set; }
}

我们为属性配置取值器,使其在读取或者写入的时候改变值:

 protected override void CreateModel(ModelBuilder modelBuilder)
{
var entity = modelBuilder.Entity<Student>();
entity.Attribute(p=>p.ArrarIndex)
.HasValueGetter(
model => model.ArrarIndex.Length > 0 ? string.Join(",", model.ArrarIndex) : "")
.HasValueSetter<string>(
(model, s) =>
{
if (!string.IsNullOrEmpty(s)) model.ArrarIndex = s.Split(',');
});
}