2

我现在有一个使用 Entity Framework 5 RC(使用 Fluent API)的数据库,但我似乎无法获得特定的工作关系。在过去的几个晚上,我正在研究它,这让我发疯。

是以下关系:

链接到数据库图

如您所见,我有一个ExerciseExerciseType. 问题是,Exercise.ExerciseType导航属性没有加载。我建立的关系如下:

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

问题是我用谷歌搜索没有错误。实体被提取,但对象的相关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 回答