2025-04-23 23:37:58 +08:00
|
|
|
|
---
|
2025-04-26 11:57:13 +08:00
|
|
|
|
title: 数据库主键
|
2025-04-23 23:37:58 +08:00
|
|
|
|
createTime: 2025/04/23 21:03:10
|
|
|
|
|
permalink: /core/entity/
|
|
|
|
|
---
|
|
|
|
|
|
2025-04-26 11:57:13 +08:00
|
|
|
|
目前框架主键默认为`Id`,类型为String,如果需要修改主键名称或类型,可以参考本章节内容。
|
|
|
|
|
|
2025-04-23 23:37:58 +08:00
|
|
|
|
## 更换主键名称
|
|
|
|
|
|
|
|
|
|
系统默认的主键是以`Id`命名,如果数据库主键是其他名称,可以直接用注解进行更改:
|
|
|
|
|
|
|
|
|
|
```csharp
|
|
|
|
|
[Column("CustomerId")]
|
|
|
|
|
public string Id { get; set; }
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 如何添加主键类型为numberic的业务代码
|
|
|
|
|
|
|
|
|
|
如果数据库表中存在其他类型的主键,可以通过继承`BaseEntity`实现。目前系统默认有三个实体基类:
|
|
|
|
|
|
|
|
|
|
- `StringEntity`:针对数据库主键为varchar类型的数据表,主键按guid方式生成;
|
|
|
|
|
|
2025-04-26 11:57:13 +08:00
|
|
|
|
- `LongEntity`:针对数据库主键为numberic(15)的数据表,主键按雪花算法生成;
|
2025-04-23 23:37:58 +08:00
|
|
|
|
|
2025-04-26 11:57:13 +08:00
|
|
|
|
- `IntAutoGenEntity`:针对数据库主键为numberic且为数据库自动生成的类型表,通常为SqlServer的自动增长类型和Oracle的Sequence生成;
|
2025-04-23 23:37:58 +08:00
|
|
|
|
|
|
|
|
|
这三个基类可以覆盖90%以上的业务场景。如果这两个不能满足需求,可以自己按需求扩展。参考代码如下:
|
|
|
|
|
|
|
|
|
|
```csharp
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 数据库Id为int类型的数据实体使用该基类,用法同Entity
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class IntEntity :BaseEntity
|
|
|
|
|
{
|
|
|
|
|
[Browsable(false)]
|
|
|
|
|
public int Id { get; set; }
|
|
|
|
|
public override bool KeyIsNull()
|
|
|
|
|
{
|
|
|
|
|
return Id == 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 需要自己有个生成随机ID的算法,可参考LongEntity中的雪花算法
|
|
|
|
|
/// </summary>
|
|
|
|
|
public override void GenerateDefaultKeyVal()
|
|
|
|
|
{
|
|
|
|
|
Id = RandomInt();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 具体如何做
|
|
|
|
|
|
|
|
|
|
我们以一个主键为numeric(16)的表(表名为LongTable)为例:
|
|
|
|
|
|
|
|
|
|
```SQL
|
|
|
|
|
create table LongTable
|
|
|
|
|
(
|
|
|
|
|
Id numeric(16) not null
|
|
|
|
|
constraint LongTable_pk
|
|
|
|
|
primary key nonclustered,
|
|
|
|
|
Name varchar(50)
|
|
|
|
|
)
|
|
|
|
|
go
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
1. 首先创建对应的业务实体。在`OpenAuth.Repository.Domain`中添加:
|
|
|
|
|
|
|
|
|
|
```csharp
|
|
|
|
|
namespace OpenAuth.Repository.Domain
|
|
|
|
|
{
|
|
|
|
|
[Table("LongTable")]
|
|
|
|
|
public class LongTable :LongEntity
|
|
|
|
|
{
|
|
|
|
|
public string Name { get; set; }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
2. 修改`OpenAuth.Repository.OpenAuthDBContext`,增加成员变量:
|
|
|
|
|
|
|
|
|
|
```csharp
|
|
|
|
|
public virtual DbSet<LongTable> IntTables { get; set; }
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
3. 最后创建对应的业务层代码。在`OpenAuth.App`中添加:
|
|
|
|
|
|
|
|
|
|
```csharp
|
|
|
|
|
namespace OpenAuth.App
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 主键为numberic类型的业务,使用BaseLongApp基类
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class LongTableApp :BaseLongApp<LongTable, OpenAuthDBContext>
|
|
|
|
|
{
|
|
|
|
|
public void Add(LongTable application)
|
|
|
|
|
{
|
|
|
|
|
Repository.Add(application);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Update(LongTable application)
|
|
|
|
|
{
|
|
|
|
|
Repository.Update(application);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public async Task<List<LongTable>> GetList(QueryAppListReq request)
|
|
|
|
|
{
|
|
|
|
|
var applications = UnitWork.Find<LongTable>(null) ;
|
|
|
|
|
|
|
|
|
|
return applications.ToList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public LongTableApp(IUnitWork<OpenAuthDBContext> unitWork, IRepository<LongTable,OpenAuthDBContext> repository,IAuth auth)
|
|
|
|
|
: base(unitWork, repository, auth)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
然后就可以像其他应用服务一样使用这个服务
|
|
|
|
|
|