首页 > 解决方案 > 使用迁移后自动生成的 Guid 在新实体中不起作用

问题描述

我使用 Entity Framework 6.4 启动了一个 ASP.NET MVC 5 Web 应用程序。一开始,我有一个包含 4 个实体的上下文,因此数据库中有 4 个表(除了用于使用 Identity 进行用户管理的表)。现在我需要在项目中添加另一个与小型 Web API 相关的新实体。因此,我启用了迁移,将新实体添加到上下文中,并添加了新迁移。我的实体的所有 ID 都是类型Guid,并用KeyDatabaseGenerated属性装饰。

我的模型和元数据类的示例:

// MyModel.cs file
public partial class MyModel
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    // More properties...

    public virtual ApplicationUser User { get; set; }
}

// MyModelMetadata.cs file
public class MyModelMetadata
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

    [StringLength(ModelConstants.NameMaximumLength, MinimumLength = ModelConstants.NameMinimumLength)]
    public string Name { get; set; }
}

[MetadataType(typeof(MyModelMetadata))]
public partial class MyModel{ }

当我创建“旧实体”的新对象时,新 ID 会在数据库中正确生成:

public async Task CreateModel(ModelDetailsViewModel vm, ApplicationUser user)
{
    ApplicationUser dbUser = this.context.Users.Find(user.Id);
    MyModel myModel = this.mapper.Map<MyModel>(vm);
    dbUser.MyModels.Add(myModel);
    await this.context.SaveChangesAsync();
}

当我得到myModel实例时,Idis{00000000-0000-0000-0000-000000000000}和 after的值SaveChangesAsync()被设置为一个新值。

当我将新实体添加到上下文以在 Web API 控制器中使用它时,我添加了一个新迁移并将其更改为向 Id添加identity: true和参数:defaultValueSql: "newid()"

public partial class NewEntityAdded : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.NewEntities",
            c => new
                {
                    Id = c.Guid(nullable: false, identity: true, defaultValueSql: "newid()"),
                    Timestamp = c.DateTime(nullable: false),
                    // More properties...
                })
            .PrimaryKey(t => t.Id);
        
    }
    
    public override void Down()
    {
        DropTable("dbo.NewEntities");
    }
}

我使用以下代码添加新实体模型:

public async Task AddNewEntity(NewEntity newEntity)
{
    this.context.NewEntities.Add(newEntity);
    int results = await this.context.SaveChangesAsync();
}

newEntity参数自带,{00000000-0000-0000-0000-000000000000} Id但 afterSaveChangesAsync()没有更新。所以第一次添加了新实体,但第二次抛出异常,因为表中已经存在id。

综上所述,迁移之前存在的实体的 GUID 可以正确自动生成,但新迁移中添加的实体的 GUID 也不会在数据库中自动生成。你知道为什么会这样吗?我该如何解决?

PD:我想避免使用Guid.CreateNew()方法设置 ID。

标签: entity-framework-6ef-code-firstentity-framework-migrationscode-first

解决方案


推荐阅读