0

私はこのクラス構造を持っています:

パブリック クラス アクティビティ {

    [Key]
    public long ActivityId { get; set; }
    public string ActivityName { get; set; }

    public virtual HashSet<ActivityLogMessage> ActivityLogMessages { get; set; }
    public virtual HashSet<FileImportLogMessage> FileImportLogMessages { get; set; }
    public virtual HashSet<RowImportLogMessage> RowImportLogMessages { get; set; }

}

public abstract class LogMessage
{
    [Required]
    public string Message { get; set; }
    public DateTimeOffset CreateDate { get; set; }

    [Required]
    public long ActivityId { get; set; }
    public virtual Activity Activity { get; set; }
}

public class ActivityLogMessage : LogMessage
{
    public long ActivityLogMessageId { get; set; }
}

public class FileImportLogMessage : ActivityLogMessage
{
    public long? StageFileId { get; set; }
}

public class RowImportLogMessage : FileImportLogMessage
{
    public long? StageFileRowId { get; set; }
}

これは私にこれを与えます、モデル

EF5 エンティティ モデル

各メッセージ (アクティビティ、ファイル、または行) は、アクティビティに関連付けられている必要があります。第 2 レベルと第 3 レベルのカーディナリティが ActivityLogMessage と同じでないのはなぜですか? 外部キー関係 (modelbuilder を介して流暢に) を記述しようとする試みも失敗しました。

これは、EF がリレーショナルにどのようにマッピングされているかを本当に理解するための、私にとって本当に学術的な演習であり、これは私を混乱させます。

よろしく、リチャード

4

1 に答える 1

1

EF は、ナビゲーション プロパティのペアと、null 許容ではない外部キー プロパティを使用して推論するActivity.ActivityLogMessagesため、関係は必要に応じて定義されますActivityLogMessage.ActivityActivityLogMessage.ActivityId

他の 2 つの関係は、コレクションActivity.FileImportLogMessagesおよびから推測されActivity.RowImportLogMessagesます。反対側の逆ナビゲーション プロパティも、デフォルトでオプションの関係につながる外部キー プロパティもありません。

LogMessage.ActivityそしてLogMessage.ActivityId、3 つのコレクションすべての逆プロパティとして使用されることを期待している可能性があります。しかし、このようには機能しません。EF は、複数のリレーションシップで同じナビゲーション プロパティを使用できません。また、現在のモデルはRowImportLogMessage、たとえば、 に対してActivity1 つだけでなく 3 つの関係があることを意味します。

コレクションを削除すれば、あなたが望むものに近づくと思います:

public virtual HashSet<FileImportLogMessage> FileImportLogMessages { get; set; }
public virtual HashSet<RowImportLogMessage> RowImportLogMessages { get; set; }

派生型で残りActivityLogMessagesをフィルタリングすることもできます (たとえば、ゲッターのみを持つマップされていないプロパティ)。

var fileImportLogMessages = ActivityLogMessages.OfType<FileImportLogMessage>();
// fileImportLogMessages will also contain entities of type RowImportLogMessage

var rowImportLogMessage = ActivityLogMessages.OfType<RowImportLogMessage>();
于 2013-08-02T18:57:23.653 に答える