[英]Schema specified is not valid. Errors: The relationship was not loaded because the type is not available
[英]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.