2

現在、Entity Framework 5 RC (Fluent API を使用) が動作するデータベースを持っていますが、特定の関係を動作させることができないようです。そして、私がそれに取り組んでいる過去数晩、それは私を夢中にさせています。

次の関係です。

データベース図へのリンク

ご覧のとおり、 にExercise関連する がありExerciseTypeます。問題は、Exercise.ExerciseTypeナビゲーション プロパティが読み込まれていないことです。私が作った関係は次のとおりです。

EntityTypeConfiguration<Exercise>
...
this.HasRequired(ex => ex.ExerciseType)
    .WithMany(exType => exType.Exercises)
    .HasForeignKey(ex => ex.ExerciseTypeId);

問題は、Google で検索してもエラーが表示されないことです。エンティティは取得されますが、オブジェクトの関連EntityTypeプロパティは取得されません。Exercise

次のクエリを使用して を強制的ExerciseTypeにフェッチしていますが、それでも機能しないようです。

    List<Exercise> exs = db.Exercises.Include(t => t.ExerciseType).ToList();

私が築いた関係に何か問題がありますか?それとも、データベースの構成に何か問題があるのでしょうか?

エンティティのコード:

public class ExerciseType
{
    public int ExerciseTypeId { get; set; }
    public string ExerciseTypeName { get; set; }
    public System.DateTime CreatedOn { get; set; }
    public Nullable<int> CreatedBy { get; set; }
    public Nullable<System.DateTime> ModifiedOn { get; set; }
    public Nullable<int> ModifiedBy { get; set; }
    public virtual ICollection<Exercise> Exercises { get; set; }
}

public class Exercise
{
    public Exercise()
    {
        this.ExerciseTemplateMembers = new List<ExerciseTemplateMember>();
        this.TrainingSchemeMembers = new List<TrainingSchemeMember>();
        this.ExerciseType = new ExerciseType();
    }

    public int ExerciseId { get; set; }
    public int ExerciseTypeId { get; set; }
    public string ExerciseName { get; set; }
    public string DescriptionHowTo { get; set; }
    public string DescriptionResult { get; set; }
    public byte[] ExerciseImage1 { get; set; }
    public byte[] ExerciseImage2 { get; set; }
    public string ExerciseVideoUrl { get; set; }
    public bool Enabled { get; set; }
    public System.DateTime CreatedOn { get; set; }
    public Nullable<int> CreatedBy { get; set; }
    public Nullable<System.DateTime> ModifiedOn { get; set; }
    public Nullable<int> ModifiedBy { get; set; }
    public virtual ICollection<ExerciseTemplateMember> ExerciseTemplateMembers { get; set; }
    public virtual ICollection<TrainingSchemeMember> TrainingSchemeMembers { get; set; }
    public virtual ExerciseType ExerciseType { get; set; }
}

    public ExerciseMap()
    {
        // Primary Key
        this.HasKey(t => t.ExerciseId);

        // Properties
        this.Property(t => t.ExerciseName)
            .HasMaxLength(50);

        this.Property(t => t.DescriptionHowTo)
            .HasMaxLength(250);

        this.Property(t => t.DescriptionResult)
            .HasMaxLength(250);

        this.Property(t => t.ExerciseVideoUrl)
            .HasMaxLength(200);

        // Table & Column Mappings
        this.ToTable("Exercise");
        this.Property(t => t.ExerciseId).HasColumnName("ExerciseId");
        this.Property(t => t.ExerciseTypeId).HasColumnName("ExerciseTypeId");
        this.Property(t => t.ExerciseName).HasColumnName("ExerciseName");
        this.Property(t => t.DescriptionHowTo).HasColumnName("DescriptionHowTo");
        this.Property(t => t.DescriptionResult).HasColumnName("DescriptionResult");
        this.Property(t => t.ExerciseImage1).HasColumnName("ExerciseImage1");
        this.Property(t => t.ExerciseImage2).HasColumnName("ExerciseImage2");
        this.Property(t => t.ExerciseVideoUrl).HasColumnName("ExerciseVideoUrl");
        this.Property(t => t.Enabled).HasColumnName("Enabled");
        this.Property(t => t.CreatedOn).HasColumnName("CreatedOn");
        this.Property(t => t.CreatedBy).HasColumnName("CreatedBy");
        this.Property(t => t.ModifiedOn).HasColumnName("ModifiedOn");
        this.Property(t => t.ModifiedBy).HasColumnName("ModifiedBy");

        // Relationships
        this.HasRequired(ex => ex.ExerciseType)
            .WithMany(exType => exType.Exercises)
            .HasForeignKey(ex => ex.ExerciseTypeId);
    }

    public ExerciseTypeMap()
    {
        // Primary Key
        this.HasKey(t => t.ExerciseTypeId);

        // Properties
        this.Property(t => t.ExerciseTypeName)
            .IsRequired()
            .HasMaxLength(50);

        // Table & Column Mappings
        this.ToTable("ExerciseType");
        this.Property(t => t.ExerciseTypeId).HasColumnName("ExerciseTypeId");
        this.Property(t => t.ExerciseTypeName).HasColumnName("ExerciseTypeName");
        this.Property(t => t.CreatedOn).HasColumnName("CreatedOn");
        this.Property(t => t.CreatedBy).HasColumnName("CreatedBy");
        this.Property(t => t.ModifiedOn).HasColumnName("ModifiedOn");
        this.Property(t => t.ModifiedBy).HasColumnName("ModifiedBy");
    }
4

2 に答える 2

2

Exerciseコンストラクターから次の行を削除します。

this.ExerciseType = new ExerciseType();

既定のコンストラクターでナビゲーション参照プロパティをインスタンス化すると、たとえば次のようなさまざまな奇妙な問題が発生します。またはこれ: EF 4.1 Code First: なぜ EF はこのナビゲーション プロパティを設定しないのですか?

于 2012-06-26T15:24:46.537 に答える
0

EntityTypeクラスのコードを教えてください。ExerciseTypeプロパティ(あなたの場合)をvirtualにするのを忘れたとき、私は今日EF 4.3.1で同じ問題を抱えていました。そうでない場合は、やはりクラスのコードを提供してください。

遅延読み込み機能を使用する場合、エンティティは仮想とマークされたナビゲーション プロパティを持っている必要があります。EF はエンティティから継承するプロキシ クラスを生成します。プロパティが仮想でない場合、派生クラスはそのプロパティの独自の実装 (関連するオブジェクト/コレクションを遅延して読み込む必要がある実装) を提供できません。

于 2012-06-26T13:21:09.667 に答える