78 messaggi dal 18 aprile 2018
Buona sera, sto cercando di creare un database con EF che permetta agli utenti registrati di fare sondaggi, in realtà lo ho pensato in maniera molto semplice:
1 utente può rispondere una sola volta
2 per ogni sondaggio ci sono illimitate domande

namespace User.Models
{
    public class Survey
    {
        [Key]
        [Column(Order = 0)]
        public int IdSurvey { get; set; }
        [Key]
        [Column(Order = 1)]
        public DateTime DTStart { get; set; }
        public DateTime DTEnd { get; set; }
        public int IdCodSito { get; set; }
        public DateTime DTIns { get; set; }
        [StringLength(50)]
        public string NameSurvey { get; set; }
    }

    public class Question
    {
        [Key]
        public int IdQuestion { get; set; }
        public int IdSurvey { get; set; }
        [ForeignKey("IdSurvey")]
        public Survey Surveys { get; set; }
        [StringLength(50)]
        public string TxtQuestion { get; set; }
        [StringLength(50)]
        public string AnswerType { get; set; }
        [StringLength(50)]
        public string TXTFixedAnswer { get; set; }
    }

    public class Answer
    {
        [Key]
        public int IdAnswer { get; set; }
        public int IdQuestion { get; set; }
        [ForeignKey("IdQuestion")]
        public Question Questions { get; set; }
        [StringLength(350)]
        public string TXTAnswer { get; set; }
        [StringLength(50)]
        public string UserId { get; set; }
        public virtual ApplicationUser ApplicationUser { get; set; }
    }
   
    public class ApplicationUser : IdentityUser
    {

        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
        {
            // Tenere presente che il valore di authenticationType deve corrispondere a quello definito in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Aggiungere qui i reclami utente personalizzati
            return userIdentity;
        }

    }

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {

        public ApplicationDbContext()
            : base("UserRegistration", throwIfV1Schema: false)
        {
        }
        DbSet<Survey> Surveys { get; set; }
        DbSet<Question> Questions { get; set; }
        DbSet<Answer> Answers { get; set; }

        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }


L'erroe che ricevo è:
Uno o più errori di convalida rilevati durante la generazione del modello:

Question_Surveys_Target_Question_Surveys_Source: : Il numero di proprietà negli elementi Dependent e Principal Roles in un vincolo della relazione deve essere identico.


se aggiungo alla classe survey

public Question Questions { get; set; }


o invece questo errore:

L'entità finale principale di questa associazione deve essere configurata in modo esplicito mediante l'API Fluent della relazione o le annotazioni dei dati.
11.727 messaggi dal 09 febbraio 2002
Contributi
Credo che il problema dipenda dal fatto che Survey ha una chiave primaria composita, che coinvolge le colonne IdSurvey e DTStart...
[Key]
[Column(Order = 0)]
public int IdSurvey { get; set; }

[Key]
[Column(Order = 1)]
public DateTime DTStart { get; set; }


...mentre invece la classe Question va a referenziare la Survey con una chiave esterna che contempla solo la colonna IdSurvey.
[ForeignKey("IdSurvey")]
public Survey Surveys { get; set; }


Quindi devi capire se l'errore è nell'aver creato una chiave primaria composita per Survey o nell'aver coinvolto solo una colonna nella chiave esterna di Question.

ciao,
Moreno
Modificato da BrightSoul il 19 dicembre 2018 18.12 -

Enjoy learning and just keep making
78 messaggi dal 18 aprile 2018
Ok, ho messo due key in quanto non voglio che si possano creare più sondaggi nella stessa data, e oltre che un vincolo da controllare io manualmente volevo settare un limite nel model.. domani ci gioco un Po.. Come struttura invece ti sembra corretta?
11.727 messaggi dal 09 febbraio 2002
Contributi

Ok, ho messo due key in quanto non voglio che si possano creare più sondaggi nella stessa data

In questo caso penso che dovresti usare un vincolo UNIQUE su DTStart. Non è necessario che sia coinvolta nella chiave primaria.

Sì, la struttura sembra ok. Aggiungerei una proprietà di navigazione "Questions" di tipo ICollection<Question> su Survey, in modo che quando vai a presentare il sondaggio puoi facilmente navigare verso le domande che lo compongono.

ciao,
Moreno

Enjoy learning and just keep making
78 messaggi dal 18 aprile 2018
Ciao Moreno,
ho sto provando a creare il DB ma crea solo la tabella Survey e quelle classiche di aspnetuser. Non capisco perchè non crea anche le altre...
78 messaggi dal 18 aprile 2018
Ho creato un nuovo progetto e ora ha preso tutte e 3 le tabelle, apposto così. Grazie
78 messaggi dal 18 aprile 2018
Prima di andare avanti stavo valutando una cosa.. Siccome in futuro potrà esserci la necessità di rendere questa app web un' app nativa, volevo da subito suddividere questo progetto in 2 progetti, una web interface e uno Asp .NET Core, così la logica la metto su asp .NET core e un domani ho già tutto pronto..
Potrei utilizzare il DB che ho già creato, copiare le classi e modelli di un applicazione web MVC nella mio progetto ASP .Net CORE MVC così da sfruttarla allo stesso modo?
Modificato da Mirko2018 il 21 dicembre 2018 13.03 -
11.727 messaggi dal 09 febbraio 2002
Contributi
Le classi penso che potrai portarle in ASP.NET Core senza modifiche, mentre al dbcontext dovrai apportare delle modifiche perché ad esempio la API di mapping di EFCore è leggermente diversa da EF6. Comunque, te ne renderai conto se ti si dovessero presentare degli errori di compilazione.


Siccome in futuro potrà esserci la necessità di rendere questa app web un' app nativa, volevo da subito suddividere questo progetto in 2 progetti, una web interface e uno Asp .NET Core

Per la parte ASP.NET Core ti consiglio di usare Web API, mentre per la parte client scegli liberamente che tecnologia utilizzare. Pensavi a angular, vue o qualcosa del genere? Ti conviene fare un breve studio già in questo frangente se un domani dovrai portare l'app su mobile. Ad esempio potresti assicurarti che funzioni sia nel browser che con Cordova. Così non dovrai fare ulteriore lavoro domani.

ciao,
Moreno

Enjoy learning and just keep making

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.