在数据库上生成Guid,但仅当没有在实体中设置时
本文关键字:实体 设置 数据库 Guid | 更新日期: 2023-09-27 18:08:24
我有一个情况,我需要添加一个Guid属性,它不是主键,它可以与表中的几个对象共享。
我想做的是:
- 当我不给它一个值时,在数据库上生成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
但是我们没有(也不会)在我们的项目中使用迁移,所以这似乎不合适。
或这个SO问题,但这将意味着在。net中生成Guid(这似乎不是很干净,至少在我看来):EF, Code First -如何在insert
上设置自定义Guid标识值是否有一种方法来生成Guid数据库端,并设置它时,我需要在EF代码第一?
如果没有,有什么好的替代方案?在。net端生成Guids真的是个坏主意吗?(如果没有其他可能的话,我可以这样做)
假设您正在使用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是否为空,然后初始化它
- 让你必须从这个类继承的所有实体
你的基类应该看起来像
public class BaseEntity
{
public BaseEntity()
{
if(Id==Guid.Empty)
Id = Guid.NewGuid();
}
public Guid Id{get;set;}
}
为现有数据库使用迁移
- from PMC =>
Enable-migrations
- from PMC =>
Add-Migration "FirstRun"
打开生成的迁移文件,并确保清空 - 在Up方法 中使用
- from PMC =>
Update-Database -Script
,以确保生成的sql语句是alter table语句 - from PMC =>一旦您确定所需的语句只出现在SQL脚本中,然后应用:
Update-Database
.
Up
和Down
方法(这将不会在数据库上应用任何更改)Sql("")
方法添加相应的alter列流畅代码你的类应该是这样的
public class FirstRun : DbMigration
{ public override void Up()
{
Sql("alter table YourTable add constraint CT_DefaultGuid default newid() for YourColumn");
}
}
我推荐最后一种方法,它将被执行一次,并且您可以稍后向数据库添加更改。
希望对你有帮助