簡體   English   中英

指定的EF6模式無效。 錯誤:由於類型y不可用,所以未加載關系x

[英]EF6 Schema specified is not valid. Errors: The relationship x was not loaded because the type y is not available

這個問題被問了很多遍,我知道確切的問題在哪里,但是我在努力避免。

簡化的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繼承,但這聽起來不對,因為在所有這些情況下,它都是完全相同的用戶對象。

我期望表結構如下:

任務

TaskId | [FK] AssignedToId | [FK] CreatedById | [FK] ClosedById

用戶

用戶名| 名稱

有人可以在這里指出我在做什么錯。 我是否需要以某種方式調整映射以便按預期創建表

答案是肯定的。 您應該調整映射。 您在這行中做錯了:

public List<TaskEntity> TaskId { get; set; } 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類。

您可以將List<TaskEntity> Tasks添加到您的UserEntity中,以匯總前3個導航屬性的結果,但是匯總將在加載數據之后完成,您將無法在Linq查詢中使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM