entity-framework - EF Fluent API 多对一关系,未获取导航属性

标签 entity-framework ef-code-first fluent entity-framework-5

我现在有一个使用 Entity Framework 5 RC(带有 Fluent API)的数据库,但我似乎无法获得与工作的特定关系。在过去的几个晚上我都在努力做这件事,这让我发疯。

有如下关系:

Link to the database diagram

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

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

问题是我用谷歌搜索没有错误。实体已被提取,但 Exercise 对象上的相关 EntityType 属性从未被提取。

我使用以下查询来强制获取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");
    }

最佳答案

Exercise 构造函数中删除这一行:

this.ExerciseType = new ExerciseType();

在默认构造函数中实例化导航引用属性会导致各种奇怪的问题,例如:What would cause the Entity Framework to save an unloaded (but lazy loadable) reference over existing data?或者这个:EF 4.1 Code First: Why is EF not setting this navigation property?

关于entity-framework - EF Fluent API 多对一关系,未获取导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11197546/

相关文章:

entity-framework - 通过 Entity Framework 添加 "Product"的3种方法。有什么不同?

entity-framework - EF Code First - 创建数据库 - 用户登录失败

oracle - 流畅的 NHibernate 3 和 Oracle.DataAccess

asp.net - 使用 EF5 和 Newtonsoft.Json 的自引用循环

c# - 升级到 EF 4.1 后出现 DbEntityValidationException

c# - Code-First 应用程序中的 XML 列

c# - Entity Framework 4.1 Code First EDMX 问题

c# - 如何连接Azure联合根数据库并在 Entity Framework DBContext中应用联合?

nhibernate - 如何在不更新整个对象的情况下更新 Fluent NHibernate 中类的特定字段?

Java继承多级层次结构中的Fluent方法返回类型