在数据库上生成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真的是个坏主意吗?(如果没有其他可能的话,我可以这样做)

在数据库上生成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是否为空,然后初始化它
  • 让你必须从这个类继承的所有实体

你的基类应该看起来像

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"
  • 打开生成的迁移文件,并确保清空UpDown方法(这将不会在数据库上应用任何更改)
  • 在Up方法
  • 中使用Sql("")方法添加相应的alter列流畅代码
  • from PMC => Update-Database -Script,以确保生成的sql语句是alter table语句
  • from PMC =>一旦您确定所需的语句只出现在SQL脚本中,然后应用:Update-Database .

你的类应该是这样的

public class FirstRun : DbMigration
{    public override void Up()
     {
        Sql("alter table YourTable add constraint CT_DefaultGuid default newid() for YourColumn");
     }
}

我推荐最后一种方法,它将被执行一次,并且您可以稍后向数据库添加更改。

希望对你有帮助