问题描述
我使用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
的值为{00000000-0000-0000-0000-000000000000}
,并且在SaveChangesAsync()
之后被设置为新值。
当我将新实体添加到上下文以在Web API控制器中使用它时,我添加了新的迁移,并对其进行了更改,以将identity: true
和defaultValuesql: "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 (将#修改为@)