entity-framework-6 - 使用迁移后自动生成的 Guid 在新实体中不起作用
问题描述
我使用 Entity Framework 6.4 启动了一个 ASP.NET MVC 5 Web 应用程序。一开始,我有一个包含 4 个实体的上下文,因此数据库中有 4 个表(除了用于使用 Identity 进行用户管理的表)。现在我需要在项目中添加另一个与小型 Web API 相关的新实体。因此,我启用了迁移,将新实体添加到上下文中,并添加了新迁移。我的实体的所有 ID 都是类型Guid
,并用Key
和DatabaseGenerated
属性装饰。
我的模型和元数据类的示例:
// 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
is{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。
解决方案
推荐阅读
- c# - 如何将“X.PagedList.StaticPagedList”类型的对象转换为“System.Collections.Generic.IAsyncEnumerable”类型
- python - 如何在使用多个列和列名的 pandas 中编写 lambda 表达式?
- angular - Why does my angular app update result only if I resize my screen?
- rxjs - node_modules 没有导出的成员 'BehaviorSubject'
- python - Python - 如果 new_list 具有不同的值,则更新 old_list
- javascript - Angular Universal APP & Lumen API, 本地开发 HttpErrorResponse (Http failure response for (unknown url): 0 Unknown Error)
- laravel - 针对唯一值的 Laravel 验证
- javascript - 如何在 JavaScript 中从最大值中随机取一个十进制数
- vb.net - 在 .Where(..).Tolist 之后 BindingList 是否仍然是绑定列表
- c - 链表上的指针问题