Entity Framework Core 2 (Code First) updating value not working

asp.net-core-2.0 c# entity-framework-core postgresql

Question

I've been struggling with changing values in a database for a week and can't find out what I'm doing wrong. I managed to create tables, to add and delete entities but I can't change a value inside an entity.

The error I get is: The property 'Rating' on entity type 'Generation' is part of a key and so cannot be modified or marked as modified. To change the principal of an existing entity whith an identifying foreign key first delete the dependent and invoke 'SaveChanges' then associate the dependent with the new principal.

(I'm not used to the term principal but I think it is the entity which has the unique Key. I not used to the term dependent either in a database context but I think it is the entity in another table which has a link to the principal)

FYI: I'm using Microsoft.AspNetCore.All 2.0.0, Microsoft.EntityFrameworkCore 2.0.0 and Npgsql.EntityFrameworkCore.PostgreSQL 2.0.0

I'm sure this error message tries to tell me the solution but as far as I know there is nothing dependent on Rating and it's not a key. For context here are the two classes I'm using for tables in the database:

[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; }
}

(It's a database I want to keep on a server for genetic algorithms)

The code I use to change the data is quite simple but causes the error on 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();
}

(The generations are created with a negative rating to indicate that that DNA has not been tested yet)

I experimented with different data annotations such as [Editable(true)], [Required] and [ForeignKey] <- which I suppose marks it as dependent on the principal from another class/table.

Could someone help me out to "simply" change some data in a table?

Kind regards!

Cambesa

1
2
9/15/2017 4:48:51 PM

Accepted Answer

In my OnModelCreating method I was using HasKey which changed everything to primary keys.

By replacing:

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

with:

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

It marks only the generation id as primary key, the other variables are now editable.

Thanks Ivan Stoev

2
9/18/2017 8:58:15 AM


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow