这被问了很多次,我知道确切的问题在哪里,但我试图避免它。
简化POCO:
public class TaskEntity
{
public int TaskId { get; set; }
public int? AssignedToId { get; set; }
public virtual UserEntity AssignedTo { get; set; }
public int CreatedById { get; set; }
public virtual UserEntity CreatedBy { get; set; }
public int? ClosedById { get; set; }
public virtual UserEntity ClosedBy { get; set; }
}
public class UserEntity
{
public List<TaskEntity> TaskId { get; set; }
public int UserId { get; set; }
public string Name { get; set; }
}
映射:
public class TaskMap : EntityTypeConfiguration<TaskEntity>
{
public TaskMap()
{
ToTable("tTasks");
HasKey(x => x.TaskId);
HasRequired(x => x.CreatedBy).WithMany(x => x.TaskId).HasForeignKey(x => x.CreatedById).WillCascadeOnDelete(false);
HasOptional(x => x.ClosedBy).WithMany(x => x.TaskId).HasForeignKey(x => x.ClosedById).WillCascadeOnDelete(false);
HasOptional(x => x.AssignedTo).WithMany(x => x.TaskId).HasForeignKey(x => x.AssignedToId).WillCascadeOnDelete(false);
}
}
我已经读过,我应该将UserEntity分成3个不同的类,并使它们继承自TaskEntity,但这听起来不对,因为它与所有这些情况完全相同。
我希望表结构如下:
tTasks
TaskId | [FK] AssignedToId | [FK] CreatedById | [FK] ClosedById
tUsers
UserId |名称
有人能指出我在这里做错了什么。我是否需要以某种方式调整我的映射,以便按照我的预期创建我的表
答案 0 :(得分:1)
答案是肯定的。你应该调整你的映射。 你做错了就是这一行:
public List<TaskEntity> TaskId { get; set; }
。
在EF中,您无法使用不同的外键在与UserEntity相关的所有任务中获取相同的导航属性。这意味着您需要在UserEntity中的导航属性映射到TaskEntity中的每个导航属性。由于每个类中有3个导航属性,因此您需要指定哪个属性与哪个相对应。 你会得到这个:
public class TaskEntity
{
public int TaskId { get; set; }
public int? AssignedToId { get; set; }
[InverseProperty("AssignedTasks")]
public virtual UserEntity AssignedTo { get; set; }
public int CreatedById { get; set; }
[InverseProperty("CreatedTasks")]
public virtual UserEntity CreatedBy { get; set; }
public int? ClosedById { get; set; }
[InverseProperty("ClosedTasks")]
public virtual UserEntity ClosedBy { get; set; }
}
public class UserEntity
{
public int UserId { get; set; }
public string Name { get; set; }
[InverseProperty("AssignedTo")]
public virtual ICollection<TaskEntity> AssignedTasks {get; set; }
[InverseProperty("CreatedBy")]
public virtual ICollection<TaskEntity> CreatedTasks {get; set; }
[InverseProperty("ClosedBy")]
public virtual ICollection<TaskEntity> ClosedTasks {get; set; }
}
使用注释完成所有映射后,您可以删除TaskMap
类。
您可以向UserEntity添加List<TaskEntity> Tasks
,以聚合来自前3个导航属性的结果,但聚合将在数据加载后完成,您无法在Linq查询中使用它。