gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:39:16 24 4
gpt4 key购买 nike

我有一个案例,我需要添加一个不是主键的 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

但我们没有(也不会)在我们的项目中使用 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 是否为空然后初始化它
  • 让所有你必须继承的实体都继承自这个类

你的基类应该是这样的

public class BaseEntity
{
public BaseEntity()
{
if(Id==Guid.Empty)
Id = Guid.NewGuid();
}

public Guid Id{get;set;}
}

对现有数据库使用迁移

  • 来自 PMC => 启用迁移
  • 来自 PMC => 添加迁移“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");
}
}

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

希望对你有帮助

关于c# - 在数据库上生成 Guid 但仅当未在实体中设置时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39643058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com