使用迁移后,自动生成的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实例时,Id的值为{00000000-0000-0000-0000-000000000000},并且在SaveChangesAsync()之后被设置为新值。

当我将新实体添加到上下文以在Web API控制器中使用它时,我添加了新的迁移,并对其进行了更改,以将identity: truedefaultValuesql: "newid()"参数添加到ID:

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参数,但是SaveChangesAsync()之后没有更新。因此,第一次添加新实体,但是第二次抛出异常,因为该ID已存在于表中。

总而言之,迁移之前已存在的实体的GUID会自动生成,但是新迁移中添加的实体的GUID不会在数据库自动生成。你知道为什么会这样吗?而我该如何解决呢?

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)