gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:09:08 25 4
gpt4 key购买 nike

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

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

(我不习惯 principal 这个词,但我认为它是具有唯一 key 的实体。我不习惯 dependent 这个词,无论是在数据库上下文,但我认为它是另一个表中的实体,它有一个链接到 principal)

仅供引用:我正在使用 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; }
}

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

我用来更改数据的代码非常简单,但会导致 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] <- 我想将其标记为依赖于另一个类/表的主体。

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

亲切的问候!

康贝萨

最佳答案

在我的 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 });
}

它仅将代号标记为主键,其他变量现在是可编辑的。

谢谢伊万·斯托耶夫

关于c# - Entity Framework Core 2(代码优先)更新值不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46244287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com