40 messaggi dal 28 maggio 2009
Ciao,

ho due classi Type(ID,Name) e Category(ID,Type_ID,Name). Per comodità nel designer di EF ho fatto ereditare tutte le classi ad una BaseEntity(ID) togliendo gli ID da Type e Category.

Problema: quando ho una lettura o salvataggio su category, EF quando trova due ID uguali sulla tabella Type e Category salta fuori questo errore:

All objects in the EntitySet 'ApplicationDbContext.BaseEntities' must have unique primary keys. However, an instance of type 'data.models.Models.Type' and an instance of type 'data.models.Models.Category' both have the same primary key value, 'EntitySet=BaseEntities;ID=2

C'è qualche soluzione? La trovo molto limitante questa cosa in quanto è vero che ereditano entramby da BaseEntuty ma sono due classi DIVERSE!

Grazie

Dio non gioca a dadi con l'universo...tutto ha una logica!
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Simone,
bisogna vedere come Entity Framework ha mappato su db le tue classi ereditate.
Fai ricerca sui vari tipi di ereditarietà supportati da EF.
https://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application

Se, come nell'articolo, ti è stata creata una tabella Person (BaseEntity nel tuo caso), allora è normale che le due entità derivate non possano avere uno stesso ID.
Ecco la situazione a cui mi riferisco:
https://media-www-asp.azureedge.net/media/49063/tpt.png

Io non so se/come tu abbia mappato la BaseEntity ma immagino che tu non voglia usare alcun modello di ereditarietà nel database. In questo caso prova a ignorare il campo Id della BaseEntity, per far capire ad EF che non deve mapparlo su una propria tabella.
modelBuilder.Entity<BaseEntity>().Ignore(e => e.Id);


Leggi anche questo articolo per riutilizzare la configurazione per tutte le entità derivate.
https://romiller.com/2013/01/29/ef6-code-first-configuring-unmapped-base-types/

ciao,
Moreno

Enjoy learning and just keep making
40 messaggi dal 28 maggio 2009
Grazie mille.

Dopo guardo e provo.

il problema è che il designer usa i Template per generare il codice. proverò a modificare il file .tt e generare il codice che mi hai dato.

Da qui capisco perchè code first va molto molto meglio. :-)

Oggi o domani ti do un riscontro.

Grazie

Dio non gioca a dadi con l'universo...tutto ha una logica!
40 messaggi dal 28 maggio 2009
BaseEntity non è mappata nel Database. non esiste la tabella per capirsi.

Facendo tasto destro sul modello posso creare un eridarietà.

 
    public abstract partial class BaseEntity
    {
        public long ID { get; set; }
    }

    public partial class vUser : BaseEntity
    {
        public string UserName { get; set; }
        public string DisplayName { get; set; }
        public string Email { get; set; }
    }


Nel DBContext

public virtual DbSet<BaseEntity> BaseEntities { get; set; } // nel db non esiste questa classe


Questa è la mia situazione attuale.

Uso delle web api con oData 4 per esporre i metodi CRUD. Non so se può centrare qualcosa. Ma l'errore me lo da in fase di Update anche. E con il debug sono dentro al salvataggio ad esempio.

Dio non gioca a dadi con l'universo...tutto ha una logica!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.