Entity Framework Core 2(代码优先)更新值不起作用

Cam*_*esa 8 c# postgresql entity-framework-core asp.net-core-2.0

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

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

(我不习惯术语主体,但我认为它是具有唯一键的实体。我也不习惯 在数据库上下文中使用术语依赖,但我认为它是另一个表中的实体,它与的主要

仅供参考:我正在使用 Microsoft.AspNetCore.All 2.0.0、Microsoft.EntityFrameworkCore 2.0.0 和 Npgsql.EntityFrameworkCore.PostgreSQL 2.0.0

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

[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; }
}
Run Code Online (Sandbox Code Playgroud)

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

我用来更改数据的代码非常简单,但会导致 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();
}
Run Code Online (Sandbox Code Playgroud)

(世代以负面评价创建,表明 DNA 尚未经过测试)

我尝试了不同的数据注释,例如 [Editable(true)]、[Required] 和 [ForeignKey] <- 我想将其标记为依赖于另一个类/表的主体。

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

亲切的问候!

坎贝萨

Cam*_*esa 5

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

通过替换:

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

和:

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

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

感谢伊万·斯托耶夫