指定的EF6架构无效。错误:未加载关系x,因为类型y不可用

时间:2016-12-01 22:04:45

标签: c# entity-framework-6

这被问了很多次,我知道确切的问题在哪里,但我试图避免它。

简化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 |名称

有人能指出我在这里做错了什么。我是否需要以某种方式调整我的映射,以便按照我的预期创建我的表

1 个答案:

答案 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查询中使用它。