C# EF实体没有';不要指定导航属性
我试过好几种方法,但都没能成功 我有两个实体。用户和用户详细信息(如下所述)。我设法添加一个用户及其用户详细信息,但当我试图使用include(“UserDetails”)获取一个用户时,会出现以下错误 指定的包含路径无效。实体类型 “Floralist.Repository.Context.User”未声明导航 名为“UserDetails”的属性 实体如下:C# EF实体没有';不要指定导航属性,c#,entity-framework,model-view-controller,ef-code-first,C#,Entity Framework,Model View Controller,Ef Code First,我试过好几种方法,但都没能成功 我有两个实体。用户和用户详细信息(如下所述)。我设法添加一个用户及其用户详细信息,但当我试图使用include(“UserDetails”)获取一个用户时,会出现以下错误 指定的包含路径无效。实体类型 “Floralist.Repository.Context.User”未声明导航 名为“UserDetails”的属性 实体如下: public class User : Entity { public User() { Detail
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);
}
如果我没有指定包含路径,用户详细信息将显示为空。通过阅读本文,我终于实现了这一点 我必须在User-to-UserDetails和UserDetails-to-User中放置一个虚拟属性,并映射
this.hasportional(x=>x.Details).WithRequired(x=>x.User)代码>
感谢大家使用System.Data.Entity添加代码>到代码文件的顶部,并将.Include(“UserDetails”)
替换为.Include(i=>i.UserDetails)
-这应该可以帮助您找到问题所在,但我猜您尚未在两者之间映射正确的关系,因为UserDetails
没有类型为User`的虚拟字段将其链接到Users表Include
需要导航属性的名称,在您的情况下是Details
(不是UserDetails
)@IvanStoev发现得很好。我错过了那一个…所以它实际上是。Include(I=>I.Details)
@IvanStoev完成了这个技巧,但是细节的每个属性都是空的,即使它填充在数据库中。您还没有定义表之间的关系,有什么理由这样做吗?如果您知道映射是正确的,是否相应地填充了FK值?
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));