【问题标题】:EF entity doesn't specify a navigation propertyEF 实体未指定导航属性
【发布时间】:2017-12-22 03:19:52
【问题描述】:

我已经尝试了几件事,但我无法让它发挥作用。

我有 2 个实体。用户和用户详细信息(如下所述)。我设法添加了一个用户及其用户详细信息,但是当我尝试使用 include ("UserDetails") 获取一个用户时,会出现以下错误。

指定的包含路径无效。实体类型 '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));

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

【问题讨论】:

  • using System.Data.Entity; 添加到代码文件的顶部,并将.Include("UserDetails") 替换为.Include(i =&gt; i.UserDetails) - 这应该可以帮助您找到问题,尽管我的猜测是您没有映射正确的两者之间的关系,因为UserDetails 没有 User` 类型的虚拟字段将其链接到用户表
  • Include 需要导航属性的 name,在您的情况下是 Details(不是 UserDetails)。
  • @IvanStoev 很好看。我错过了那个......所以它实际上是.Include(i =&gt; i.Details)
  • @IvanStoev 做到了,但细节的每个属性都是空的,即使它被填充到数据库中
  • 你还没有定义表之间的关系,有什么理由这样做吗?如果您知道映射是正确的,您的 FK 值是否会相应地填充?

标签: c# entity-framework model-view-controller ef-code-first


【解决方案1】:

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

我必须在 User 到 UserDetails 和在 UserDetails 到 User 和映射 this.HasOptional(x =&gt; x.Details).WithRequired(x =&gt; x.User); 中放置一个虚拟属性

谢谢大家

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多