0

J'ai essayé plusieurs choses et je n'arrive pas à mettre cela à l'œuvre.L'entité EF ne spécifie pas de propriété de navigation

J'ai 2 entités. User et UserDetails (décrits ci-dessous). Je parviens à ajouter un utilisateur et ses détails d'utilisateur mais quand j'essaye d'en obtenir un en utilisant l'include ("UserDetails"), j'obtiens l'erreur suivante.

Un chemin Include spécifié n'est pas valide. L'EntityType 'Floralist.Repository.Context.User' ne déclare pas une propriété de navigation avec le nom 'UserDetails'.

Les entités sont les suivantes:

public class User : Entity 
{ 
    public User() 
    { 
     Details = new UserDetails(); 
     //FlowerList = new Collection<Flower>(); 
    } 

    public Guid Id { get; set; } 

    public string Username { get; set; } 

    [Index(IsUnique = true)] 
    public string Email { get; set; } 

    public string Password { get; set; } 

    public Roles Role { get; set; } 

    public UserState State { get; set; } 

    public int? DetailsId { get; set; } 
    public UserDetails Details { get; set; } 

    public DateTime? LastLoginDate { get; set; } 

    //public ICollection<Flower> FlowerList { get; set; } 

    //public ICollection<Friend> FriendList { get; set; } 

} 

public class UserDetails : Entity 
{ 
    public int Id { get; set; } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public string FullName => $"{this.FirstName} {this.LastName}"; 

    public string Address { get; set; } 

    public string PostalCode { get; set; } 

    public DateTime BirthDate { get; set; } 

    public int? WatermarkId { get; set; } 

    public Blob Watermark { get; set; } 

    public int? ProfilePictureId { get; set; } 

    public Blob ProfilePicture { get; set; } 
} 

Les correspondances sont les suivantes:

public class UserMap : EntityTypeConfiguration<User> 
{ 
    public UserMap() 
    { 
     this.HasKey(t => t.Id); 

     this.ToTable("Users"); 

     this.Property(t => t.Id).HasColumnName("Id"); 

     this.Property(t => t.Username) 
      .IsRequired() 
      .HasMaxLength(48) 
      .HasColumnName("Username"); 

     this.Property(t => t.Password) 
      .HasMaxLength(256) 
      .HasColumnName("Password"); 

     this.Property(t => t.Email) 
      .IsRequired() 
      .HasMaxLength(256) 
      .HasColumnName("Email"); 

     this.Property(t => t.Role) 
      .IsRequired() 
      .HasColumnName("Role"); 

     this.Property(t => t.State) 
      .IsRequired() 
      .HasColumnName("State"); 

     this.Property(t => t.LastLoginDate) 
      .IsOptional() 
      .HasColumnName("LastLoginDate"); 

     this.Property(t => t.CreateDate) 
      .IsRequired() 
      .HasColumnName("CreateDate"); 

     this.Property(t => t.UpdateDate) 
      .IsOptional() 
      .HasColumnName("UpdateDate"); 

     this.Property(t => t.DetailsId) 
      .HasColumnName("DetailsId"); 
    } 
} 

public UserDetailsMap() 
    { 
     this.HasKey(t => t.Id); 

     this.ToTable("UsersDetails"); 

     this.Property(t => t.Id).HasColumnName("Id"); 

     this.Property(t => t.WatermarkId) 
      .HasColumnName("WatermarkId"); 

     this.Property(t => t.ProfilePictureId) 
      .HasColumnName("ProfilePictureId"); 

     this.Property(t => t.FirstName) 
      .IsRequired() 
      .HasMaxLength(64) 
      .HasColumnName("FirstName"); 

     this.Property(t => t.LastName) 
      .IsRequired() 
      .HasMaxLength(64) 
      .HasColumnName("LastName"); 

     this.Property(t => t.Address) 
      .HasMaxLength(512) 
      .HasColumnName("Address"); 

     this.Property(t => t.PostalCode) 
      .HasMaxLength(64) 
      .HasColumnName("PostalCode"); 

     this.Property(t => t.BirthDate) 
      .HasColumnName("BirthDate"); 

     this.Property(t => t.CreateDate) 
      .IsRequired() 
      .HasColumnName("CreateDate"); 

     this.Property(t => t.UpdateDate) 
      .IsRequired() 
      .HasColumnName("UpdateDate"); 

     //this.HasOptional(t => t.ProfilePicture).WithMany().HasForeignKey(f => f.ProfilePictureId); 
     //this.HasOptional(t => t.Watermark).WithMany().HasForeignKey(f => f.WatermarkId); 
    } 

Et le contexte:

internal class FloralistContext : DbContext 
{ 
    private const string Dbmodule = "Floralistdb"; 

    public FloralistContext() : base(Dbmodule) 
    { 
    } 

    public DbSet<User> Users { get; set; } 

    public DbSet<UserDetails> UserDetails { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); 
     modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 

     modelBuilder.Configurations.Add(new UserMap()); 
     modelBuilder.Configurations.Add(new UserDetailsMap()); 
    } 
} 

Je reçois l'erreur lors de cette opération :

  var user = Repository.Users.Include("UserDetails").FirstOrDefault(u => u.Email.Equals(email, StringComparison.InvariantCultureIgnoreCase) && u.Password.Equals(password)); 

Si je ne spécifie pas le chemin d'inclusion, les informations utilisateur sont nulles.

+0

Ajouter 'using System.Data.Entity;' en haut de votre fichier de code et le remplacer '.Include (" UserDetails ")' avec '.Include (i => i.UserDetails)' - cela devrait vous aider à trouver le problème je suppose que vous n'avez pas mappé une bonne relation entre les deux puisque 'UserDetails' n'a pas de champ virtuel de type User' à l Encre à la table des utilisateurs – Ortund

+0

Le 'Include' attend le ** nom ** de la propriété de navigation, qui dans votre cas est' Details' (pas 'UserDetails'). –

+0

@IvanStoev bien repéré. J'ai raté celui-là ... donc ce serait effectivement. .Inclure (i => i.Details) ' – Ortund

Répondre

0

J'ai finalement obtenu que cela fonctionne en lisant ce post EF understanding association

je devais mettre une propriété virtuelle utilisateur à UserDetails et UserDetails à l'utilisateur et une cartographie this.HasOptional(x => x.Details).WithRequired(x => x.User);

Merci à tous