在数据库上生成 Guid 但仅当未在实体中设置时
Generate Guid on database but only when not set in entity
我有一个案例,我需要添加一个 Guid 属性,它不是主键,并且可以与 table 中的多个对象共享。
我想做的是:
- 当我没有给它赋值时在数据库上生成Guid
- 当我有它的值时设置一个 Guid(而不是生成它)
这两个操作只会在插入时完成,更新不会触及这些值。
我尝试过的:
- 添加 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 属性:仅在不需要手动设置 Guid 时有效
- 添加 [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 属性:当我没有手动设置 Guid 时不起作用
我看过很多关于这个话题的文章,最接近的是这篇文章:
http://www.davepaquette.com/archive/2012/09/23/calculated-columns-in-entity-framework-code-first-migrations.aspx
但是我们没有(也不会)在我们的项目中使用 Migration,所以这似乎不合适。
或这个 SO 问题,但这意味着在 .Net 中生成 Guid(这似乎不是很干净,至少在我看来):EF, Code First - How to set a custom Guid identity value on insert
有没有办法生成 Guid 数据库端,并在我需要时先在 EF 代码中设置它?
如果没有,什么是好的选择?在 .Net 端生成 Guid 真的是个坏主意吗? (如果没有别的办法,我可以接受)
我假设你使用的是 MS-SQL ,那么你可以执行以下操作
使用执行命令
public class YourDbContext: DbContext
{
public YourDbContext():base("ConnectionString")
{
if (Database.Exists())
{
Database.ExecuteSqlCommand("if object_id('CT_DefaultGuid') is null alter table YourTable add constraint CT_DefaultGuid default newid() for YourColumn");
}
}
}
要从 .Net 设置 Id,您可以执行以下操作
- 创建一个基础实体包含 Id 属性
- 在构造函数中检查 Id 是否为空然后初始化它
- 让您必须继承的所有实体都从此 class
你的基地class应该看起来像
public class BaseEntity
{
public BaseEntity()
{
if(Id==Guid.Empty)
Id = Guid.NewGuid();
}
public Guid Id{get;set;}
}
对现有数据库使用迁移
- 来自 PMC =>
Enable-migrations
- 来自 PMC =>
Add-Migration "FirstRun"
- 打开生成的迁移文件并确保清空
Up
和 Down
方法(这不会对数据库应用任何更改)
- 在Up方法中使用
Sql("")
方法添加相应的alter column fluent code
- 来自 PMC =>
Update-Database -Script
,以确保只有 sql 生成的语句是 alter table 语句
- 来自 PMC => 一旦您确定所需的语句是唯一出现在 SQL 脚本中的,然后应用:
Update-Database
.
你的class应该喜欢这个
public class FirstRun : DbMigration
{ public override void Up()
{
Sql("alter table YourTable add constraint CT_DefaultGuid default newid() for YourColumn");
}
}
我推荐最后一种方法,它会执行一次,您可以稍后将更改添加到您的数据库中。
希望对您有所帮助
我有一个案例,我需要添加一个 Guid 属性,它不是主键,并且可以与 table 中的多个对象共享。
我想做的是:
- 当我没有给它赋值时在数据库上生成Guid
- 当我有它的值时设置一个 Guid(而不是生成它)
这两个操作只会在插入时完成,更新不会触及这些值。
我尝试过的:
- 添加 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 属性:仅在不需要手动设置 Guid 时有效
- 添加 [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 属性:当我没有手动设置 Guid 时不起作用
我看过很多关于这个话题的文章,最接近的是这篇文章: http://www.davepaquette.com/archive/2012/09/23/calculated-columns-in-entity-framework-code-first-migrations.aspx
但是我们没有(也不会)在我们的项目中使用 Migration,所以这似乎不合适。
或这个 SO 问题,但这意味着在 .Net 中生成 Guid(这似乎不是很干净,至少在我看来):EF, Code First - How to set a custom Guid identity value on insert
有没有办法生成 Guid 数据库端,并在我需要时先在 EF 代码中设置它?
如果没有,什么是好的选择?在 .Net 端生成 Guid 真的是个坏主意吗? (如果没有别的办法,我可以接受)
我假设你使用的是 MS-SQL ,那么你可以执行以下操作
使用执行命令
public class YourDbContext: DbContext
{
public YourDbContext():base("ConnectionString")
{
if (Database.Exists())
{
Database.ExecuteSqlCommand("if object_id('CT_DefaultGuid') is null alter table YourTable add constraint CT_DefaultGuid default newid() for YourColumn");
}
}
}
要从 .Net 设置 Id,您可以执行以下操作
- 创建一个基础实体包含 Id 属性
- 在构造函数中检查 Id 是否为空然后初始化它
- 让您必须继承的所有实体都从此 class
你的基地class应该看起来像
public class BaseEntity
{
public BaseEntity()
{
if(Id==Guid.Empty)
Id = Guid.NewGuid();
}
public Guid Id{get;set;}
}
对现有数据库使用迁移
- 来自 PMC =>
Enable-migrations
- 来自 PMC =>
Add-Migration "FirstRun"
- 打开生成的迁移文件并确保清空
Up
和Down
方法(这不会对数据库应用任何更改) - 在Up方法中使用
Sql("")
方法添加相应的alter column fluent code - 来自 PMC =>
Update-Database -Script
,以确保只有 sql 生成的语句是 alter table 语句 - 来自 PMC => 一旦您确定所需的语句是唯一出现在 SQL 脚本中的,然后应用:
Update-Database
.
你的class应该喜欢这个
public class FirstRun : DbMigration
{ public override void Up()
{
Sql("alter table YourTable add constraint CT_DefaultGuid default newid() for YourColumn");
}
}
我推荐最后一种方法,它会执行一次,您可以稍后将更改添加到您的数据库中。
希望对您有所帮助