实体框架核心2(代码优先)更新值不起作用

时间:2017-09-15 16:48:52

标签: c# postgresql entity-framework-core asp.net-core-2.0

我一直在努力改变数据库中的值一周,但却无法找出我做错了什么。我设法创建表,添加和删除实体,但我无法更改实体内的值。

我得到的错误是:实体类型'Generation'上的属性'Rating'是密钥的一部分,因此无法修改或标记为已修改。要更改现有实体的主体,使用标识外键首先删除依赖项并调用“SaveChanges”,然后将依赖项与新主体关联。

(我不习惯 principal 这个词,但我认为它是具有唯一Key的实体。我不习惯术语依赖数据库上下文,但我认为它是另一个表中的实体,它有一个指向主体的链接

仅供参考:我使用的是Microsoft.AspNetCore.All 2.0.0,Microsoft.EntityFrameworkCore 2.0.0和Npgsql.EntityFrameworkCore.PostgreSQL 2.0.0

我确定此错误消息试图告诉我解决方案,但据我所知,没有任何依赖于评级并且它不是密钥。对于上下文,这里是我用于数据库中表的两个类:

[Table("Generation")]
public class Generation
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int GenerationId { get; set; }

    [Required]
    [MaxLength(100)]
    public string DNA { get; set; }
    //[Editable(true)]
    public double Rating { get; set; }

    public Generation(int ID, string dna, double rate)
    {
        GenerationId = ID;
        DNA = dna;
        Rating = rate;
    }

    public Generation()
    {

    }
}

[Table("Device")]
public class Device
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int DeviceID { get; set; }

    //[Required]
    [MaxLength(100)]
    public string Identifier { get; set; }

    //[ForeignKey("GenerationId2")] <-- should be changed to GenerationId in the near future
    public int GenerationId2 { get; set; }
    public float WaitingSeconds { get; set; }
}

(这是我想保留在服务器上用于遗传算法的数据库)

我用来更改数据的代码非常简单,但导致SaveChanges()的错误:

Generation gen = Program.Context.Generation.FirstOrDefault(g => g.Rating < 0.0);
if (gen != null)
{
gen.Rating = 10.0;
Debug.Log("DNA: About to save changes");
Program.Context.SaveChanges();
}

(产生的代数为负值,表明该DNA尚未经过测试)

我尝试了不同的数据注释,例如[Editable(true)],[Required]和[ForeignKey]&lt; - 我认为它标记为依赖于来自另一个类/表的主体。

有人可以帮我“简单地”更改表格中的某些数据吗?

亲切的问候!

Cambesa

1 个答案:

答案 0 :(得分:2)

在我的OnModelCreating方法中,我使用的是HasKey,它将所有内容都更改为主键。

替换:

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Generation>().HasKey(g => new { { g.DNA, g.GenerationId, g.Rating } });
    }

使用:

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Generation>().HasKey(g => new { g.GenerationId });
        }

它仅将生成ID标记为主键,其他变量现在可编辑。

感谢Ivan Stoev