2016-12-01 10 views
0

これは何度か尋ねられます。正確な問題はどこにあるのか知っていますが、避けようとしています。指定されたEF6スキーマは無効です。エラー:タイプyが利用できないため、関係xがロードされていません

簡体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); 

    } 
} 

私は3つの異なるクラスにUserEntityを分離し、それらをTaskEntityから継承させる必要があることを読んだことがあるが、これは右のように聞こえるしません。これらのすべてのケースでは、まったく同じユーザーオブジェクトになります。

私は次のようにテーブル構造を持つことを期待しています:

タスクIDを

tTasks | [FK] AssignedToId | [FK] CreatedById | [FK] ClosedById

tUsers

ユーザーID |名前

ここで間違っていることを誰かが指摘できますか。何らかの形でテーブルを作成してテーブルを作成する必要がありますか

答えて

1

答えははいです。マッピングを調整する必要があります。 あなたが間違っていることは、この行にあります:

public List<TaskEntity> TaskId { get; set; }です。

EFでは、異なる外部キーを持つUserEntityに関連するすべてのタスクを同じナビゲーションプロパティで取得することはできません。つまり、TaskEntityのすべてのナビゲーションプロパティに対してマップされるUserEntityのナビゲーションプロパティが必要です。また、すべてのクラスに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; } 
} 

: あなたはこれを取得します。

UserEntityに前の3つのナビゲーションプロパティの結果を集計しますが、集計はデータがロードされた後に実行され、Linqクエリでは使用できません。

+0

答えてくれてありがとう、今働いているときに、私はそれを理解することができます、ありがとう! – Raimonds

関連する問題