EF .Core 3.1 composite problemas primarios / extranjeros clave después de la actualización de . NET Core 2.1

Tengo dos mesas:

CREATE TABLE [dbo].[FormGridElementColumns]
(
    [FormGridElementColumnId] [uniqueidentifier] NOT NULL,
    [FormGridElementSchemaId] [uniqueidentifier] NOT NULL,
    [Caption] [nvarchar](256) NOT NULL,
    [Ordering] [int] NOT NULL,
    [Precision] [int] NULL
)

ALTER TABLE [dbo].[FormGridElementColumns] 
    ADD CONSTRAINT [PK_FormGridElementColumns] 
        PRIMARY KEY CLUSTERED ([FormGridElementSchemaId] ASC,
                               [FormGridElementColumnId] ASC)

y

CREATE TABLE [dbo].[FormGridElementColumnDataAdapters]
(
    [FormGridElementColumnDataAdapterId] [uniqueidentifier] NOT NULL,
    [FormGridElementColumnId] [uniqueidentifier] NULL,
    [FormGridElementSchemaId] [uniqueidentifier] NULL,
    [DisplayColumn] [nvarchar](256) NOT NULL
)

ALTER TABLE [dbo].[FormGridElementColumnDataAdapters] 
    ADD CONSTRAINT[PK_FormGridElementColumnDataAdapters] 
        PRIMARY KEY CLUSTERED ([FormGridElementColumnDataAdapterId] ASC)
GO

ALTER TABLE [dbo].[FormGridElementColumnDataAdapters] WITH CHECK 
    ADD CONSTRAINT [FK_FormGridElementColumnDataAdapters_FormGridElementColumns] 
        FOREIGN KEY ([FormGridElementSchemaId], [FormGridElementColumnId])
        REFERENCES [dbo].[FormGridElementColumns]([FormGridElementSchemaId], [FormGridElementColumnId])
            ON DELETE CASCADE

Y modelos:

public class FormGridElementColumn
{
    public Guid FormGridElementColumnId { get; set; }
    public Guid FormGridElementSchemaId { get; set; }
    
    public string Caption { get; set; }
    public int Ordering { get; set; }
    public int? Precision { get; set; }

    public FormGridElementColumnDataAdapter FormElementDataAdapter { get; set; }
}

public class FormGridElementColumnDataAdapter
{
    public Guid FormGridElementColumnDataAdapterId { get; set; }

    public Guid? FormGridElementSchemaId { get; set; }
    public Guid? FormGridElementColumnId { get; set; }
    public string DisplayColumn { get; set; }
}

Todo funcionó bien antes de la actualización. Pero después de mudarse a . NET Core 3.1, obtengo el siguiente error:

Sistema.Operación inválida Excepción: El lado niño/dependiente no se puede determinar para la relación uno-a-uno entre 'FormGridElementColumnDataAdapter' y 'FormGridElementColumn.FormElementDataAdapter'. Para identificar el lado niño/dependiente de la relación, configure la propiedad clave extranjera. Si estas navegaciónes no deben ser parte de la misma relación configurarlas sin especificar el inverso.

Trata de arreglar esto. OnModelCreating:

    modelBuilder.Entity(b =>
        {
            b.HasKey(p=> new {p.FormGridElementSchemaId, p.FormGridElementColumnId});
            ...
            b.HasOne(c => c.FormElementDataAdapter).WithOne().HasForeignKey(k=> new{ k.FormGridElementSchemaId, k.FormGridElementColumnId});
            ...
            b.ToTable("FormGridElementColumns");
        });

Pero ahora tengo otros errores:

Nombre de columna inválido 'FormGridElementColumnFormGridElementSchemaId'.
Nombre de columna inválido 'FormGridElementColumnId1'.
Nombre de columna inválido 'FormGridElementColumnFormGridElementSchemaId'.
Nombre de columna inválido 'FormGridElementColumnId1'.
Nombre de columna inválido 'FormGridElementColumnFormGridElementSchemaId'.
Nombre de columna inválido 'FormGridElementColumnId1'.
Nombre de columna inválido 'FormGridElementColumnFormGridElementSchemaId'.
Nombre de columna inválido 'FormGridElementColumnId1'.
Nombre de columna inválido 'FormGridElementColumnFormGridElementSchemaId'.
Nombre de columna inválido 'FormGridElementColumnId1'.
Nombre de columna inválido 'FormGridElementColumnFormGridElementSchemaId'.
Nombre de columna inválido 'FormGridElementColumnId1'.

Mismo error si estoy tratando de agregar columna de propiedad de navegación a la entidad infantil (FormGridElementColumnDataAdapter).

Cualquier ayuda será apreciada!

UPD1: ¿Es posible que EF Core 3.1 tenga algunos cambios relacionados con el mapeo de tipos clave? Tengo la llave primaria como un par de Guids no nullables pero la llave extranjera es un par de nullables..no seguro de que este es el caso pero sólo tratando de encontrar solución.

Pregunta hecha hace 3 años, 5 meses, 0 días - Por quantumcoderd26d


3 Respuestas:

  • Usted necesita utilizar propiedades de navegación en sus clases cuando usted tiene una llave extranjera:

    public class FormGridElementColumnDataAdapter
    {
        public Guid FormGridElementColumnDataAdapterId { get; set; }
        
        //Using the object instead of the key
        public FormGridElementColumn FormGridElementColumn { get; set; }
    
        public string DisplayColumn { get; set; }
    }
    

    Y en su constructor de modelos:

    modelBuilder.Entity(b =>
    {
        b.HasOne(c => c.FormElementDataAdapter).WithOne(x => x.FormGridElementColumn).HasForeignKey(k => new{ k.FormGridElementSchemaId, k.FormGridElementColumnId});
    });
    

    Respondida el Dec 17, 2020 a las 11:45 - por logicloom

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando después de la actualización a .NET Core 3.1 está relacionado con la configuración de las relaciones de clave primaria y clave foránea en tus modelos y en el método OnModelCreating de tu DbContext.

    En EF Core 3.1, las configuraciones de entidades con múltiples propiedades de clave primaria han cambiado ligeramente, por lo que es necesario ajustar la forma en que defines las relaciones uno a uno en tu contexto.

    Para solucionar el problema, puedes realizar los siguientes cambios en tu método OnModelCreating:

    csharp
    modelBuilder.Entity(b =>
    {
        b.HasKey(p => p.FormGridElementColumnId); // Definir solo la clave primaria principal
        b.Property(p => p.FormGridElementSchemaId).IsRequired(); // Asegurarse de que esta propiedad sea requerida
    
        b.HasOne(c => c.FormElementDataAdapter)
            .WithOne()
            .HasForeignKey(k => new { k.FormGridElementSchemaId, k.FormGridElementColumnId });
    
        b.ToTable("FormGridElementColumns");
    });
    
    modelBuilder.Entity(b =>
    {
        b.HasKey(p => p.FormGridElementColumnDataAdapterId); // Definir la clave primaria de esta entidad
    
        // Definir la relación con la entidad principal
        b.HasOne(c => c.FormElementColumn)
            .WithOne(c => c.FormElementDataAdapter)
            .HasForeignKey(c => new { c.FormGridElementSchemaId, c.FormGridElementColumnId });
    
        b.ToTable("FormGridElementColumnDataAdapters");
    });
    

    Al especificar las claves primarias y las relaciones de esta manera, le estás indicando a Entity Framework Core cómo mapear correctamente las tablas y las relaciones entre las entidades.

    Además, ten en cuenta que en tus modelos FormGridElementColumn y FormGridElementColumnDataAdapter, las propiedades de clave foránea deben ser definidas como Guid? para reflejar que son valores nulos en el esquema de base de datos.

    Espero que esta solución te ayude a resolver los errores que estás experimentando. Si tienes alguna otra pregunta, no dudes en preguntar.

    Respondida el Dec 18, 2020 a las 11:45 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • ésta relacionada. Polda dataTableglLoadIdentity. p DOWNVOTE1, Salgado.escof podefora/fora

    Respondida el Dec 18, 2020 a las 11:54 - por Gemini

    Votos positivos: 0 | Votos negativos: 0