Ef code first 实体框架addorupdate错误,带有DatabaseGenerated字段
以下是我的模型课程:Ef code first 实体框架addorupdate错误,带有DatabaseGenerated字段,ef-code-first,entity-framework-migrations,Ef Code First,Entity Framework Migrations,以下是我的模型课程: public abstract class BaseEntity { [Key] public Guid Guid { get; set; } [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)] public int Id { get; set; }
public abstract class BaseEntity
{
[Key]
public Guid Guid { get; set; }
[DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
public int Id
{
get;
set;
}
}
public class Menu : Abstract.BaseEntity
{
public string Title { get; set; }
public string Url { get; set; }
}
public class SpaceShipEntities : DbContext
{
public DbSet<Menu> Menu { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
公共抽象类BaseEntity
{
[关键]
公共Guid Guid{get;set;}
[DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGenerateOptions.Identity)]
公共整数Id
{
得到;
设置
}
}
公共类菜单:Abstract.BaseEntity
{
公共字符串标题{get;set;}
公共字符串Url{get;set;}
}
公共类太空船实体:DbContext
{
公共数据库集菜单{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
}
}
我使用迁移。这是我的配置类:
internal sealed class Configuration : DbMigrationsConfiguration<SpaceProject.Models.SpaceShipEntities>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(SpaceProject.Models.SpaceShipEntities context)
{
context.Menu.AddOrUpdate(
c => c.Title,
new Menu() { Guid = Guid.NewGuid(), Title = "Главная" }
);
}
}
内部密封类配置:dbmigtorinsconfiguration
{
公共配置()
{
AutomaticMiggerationsEnabled=假;
}
受保护的替代无效种子(SpaceProject.Models.SpaceShipEntities上下文)
{
context.Menu.AddOrUpdate(
c=>c.标题,
新建菜单(){Guid=Guid.NewGuid(),Title=“Гааааа”}
);
}
}
当我在空数据库中使用包命令“updatedatabase-Verbose”时,新行已插入到数据库中。但当我第二次使用“updatedatabase-Verbose”时,Seed方法尝试更新行,我有以下错误:
更新记录时发生错误。有关详细信息,请参阅内部异常。-->System.InvalidOperationException:不支持更改列模板“标识”。栏:“Id”。表:“CodeFirstDatabaseSchema.Menu”
如果将Guid用作键,则它仍将被索引。我将使用Id作为键,并用[DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGenerateOption.Identity)]装饰Guid,然后用以下内容作为种子:
protected override void Seed(SpaceProject.Models.SpaceShipEntities context)
{
context.Menu.AddOrUpdate(
c => c.Guid,
new Menu() { Guid = Guid.Parse("..."), Title = "Главная" }
);
}
这似乎与您有一个作为键的Guid和一个自动生成的int有关。它正在尝试将菜单表上的标识(键)列从Guid更改为int。为什么这两列都有?你能去掉一列吗?这不是一个解决方案,但它可能有助于解决问题!我需要uniqueidentifier字段,因为另一个处理数据库的程序需要这种类型的字段作为键列。用于排序和计数的标识列。