2017-07-17 56 views
0

我尝试了几件事情,但我无法设法使其工作。EF实体没有指定导航属性

我有2个实体。 User和UserDetails(如下所述)。我设法添加一个用户和它的用户细节,但是当我尝试使用include(“UserDetails”)时得到一个e得到以下错误。

指定的包含路径无效。 EntityType 'Floralist.Repository.Context.User'没有声明名为'UserDetails'的导航 属性。

的实体如下:

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; } 
} 

的映射如下:

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); 
    } 

和上下文:这样做时,我得到了错误

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()); 
    } 
} 

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

如果我不指定包含路径,则用户详细信息为空。

+0

添加'使用System.Data.Entity;'到代码文件的顶部,用'.Include(i => i.UserDetails)'替换'.Include(“UserDetails”)' - 这应该可以帮助你找到问题我的猜测是你没有在两者之间映射出适当的关系,因为UserDetails没有User类型的虚拟字段,将它打印到用户表 – Ortund

+0

'Include'需要导航属性的**名称**,在您的情况下是'Details'(而不是'UserDetails')。 –

+0

@IvanStoev很好发现。我错过了那个......所以它实际上就是'.Include(i => i.Details)' – Ortund

回答

0

我终于得到这个通过阅读这篇文章EF understanding association

我不得不把在用户的虚拟财产的UserDetails和的UserDetails对用户和映射this.HasOptional(x => x.Details).WithRequired(x => x.User);

感谢,对所有人