【发布时间】: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 => i.UserDetails)- 这应该可以帮助您找到问题,尽管我的猜测是您没有映射正确的两者之间的关系,因为UserDetails没有 User` 类型的虚拟字段将其链接到用户表 -
Include需要导航属性的 name,在您的情况下是Details(不是UserDetails)。 -
@IvanStoev 很好看。我错过了那个......所以它实际上是
.Include(i => i.Details) -
@IvanStoev 做到了,但细节的每个属性都是空的,即使它被填充到数据库中
-
你还没有定义表之间的关系,有什么理由这样做吗?如果您知道映射是正确的,您的 FK 值是否会相应地填充?
标签: c# entity-framework model-view-controller ef-code-first