I've tried several things and i cant manage to put this to work.
I've 2 entities. User and UserDetails (described below). I manage to add a user and it's user details but when i try to get one using the include ("UserDetails") e get the following error.
A specified Include path is not valid. The EntityType 'Floralist.Repository.Context.User' does not declare a navigation property with the name 'UserDetails'.
The entities are the following:
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; }
}
The mappings are the following:
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);
}
And the context:
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());
}
}
I get the error when doing this:
var user = Repository.Users.Include("UserDetails").FirstOrDefault(u => u.Email.Equals(email, StringComparison.InvariantCultureIgnoreCase) && u.Password.Equals(password));
If i don't specify the include path the user details comes as null.