在数据库上生成 Guid 但仅当未在实体中设置时

Generate Guid on database but only when not set in entity

我有一个案例,我需要添加一个 Guid 属性,它不是主键,并且可以与 table 中的多个对象共享。

我想做的是:

这两个操作只会在插入时完成,更新不会触及这些值。

我尝试过的:

我看过很多关于这个话题的文章,最接近的是这篇文章: 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"
  • 打开生成的迁移文件并确保清空 UpDown 方法(这不会对数据库应用任何更改)
  • 在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");
     }
}

我推荐最后一种方法,它会执行一次,您可以稍后将更改添加到您的数据库中。

希望对您有所帮助