EF Fluent API多对一关系,导航属性未被提取 [英] EF Fluent API many to one relation, navigation property is not fetched

查看:115
本文介绍了EF Fluent API多对一关系,导航属性未被提取的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个数据库与实体框架5 RC(与Fluent API)现在工作,但我似乎无法得到一个特定的关系工作。这是我在工作的过去几个晚上开车的坚果。



这是以下关系:



链接到数据库图



如你所见,我有一个练习,它与 ExerciseType 相关。问题是,导航属性 Exercise.ExerciseType 未加载。我所做的关系如下:

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

问题是我没有任何错误。实体被提取,但 Exercise 对象之间相关的 EntityType 属性从未被提取。



我正在使用以下查询来强制执行 ExerciseType ,但这似乎不会它可以工作。

 列表<练习> exs = db.Exercises.Include(t => t.ExerciseType).ToList(); 

我创建的关系有什么问题吗?或者数据库配置有问题吗?



实体代码:

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


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

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

public ExerciseMap()
{
//主键
this.HasKey(t => t.ExerciseId);

//属性
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&列映射
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);

//关系
this.HasRequired(ex => ex.ExerciseType)
.WithMany(exType => exType.Exercises)
.HasForeignKey(ex = exeExerciseTypeId);
}

public ExerciseTypeMap()
{
//主键
this.HasKey(t => t.ExerciseTypeId);

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

// Table&列映射
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);
}


解决方案

<> code>

<新的ExerciseType();

在默认构造函数中实例化导航参考属性会导致各种奇怪的问题,例如:一个href =https://stackoverflow.com/questions/6779226/what-would-cause-the-entity-framework-to-save-an-unloaded-but-lazy-loadable-re>什么会导致实体保存对现有数据的卸载(但可延迟加载)引用的框架或者这样: EF 4.1代码第一:为什么EF不设置此导航属性?


I have a database with the Entity Framework 5 RC (with Fluent API) working now, but I can't seem to get a specific relation to work. And it is driving me nuts for the past few nights I'm working on it.

It is the following relation:

Link to the database diagram

As you can see, I have a Exercise which is related to an ExerciseType. The problem is, the Exercise.ExerciseType navigation property, is not loaded. The relation I made is as follows:

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

The problem is that there is no error for me to google on. The entities are fetched, but the related EntityType property on the Exercise objects, is never fetched.

I am using the following query to force the ExerciseType to be fetched, but that doesn't seem to make it work either.

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

Is there someting wrong with the relationship I created? Or is there something wrong with the database configuration perhaps?

Code for the entities:

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");
    }

解决方案

Remove this line from the Exercise constructor:

this.ExerciseType = new ExerciseType();

Instantiating navigation reference properties in the default constructor causes all sorts of strange problems, like this for example: What would cause the Entity Framework to save an unloaded (but lazy loadable) reference over existing data? Or this: EF 4.1 Code First: Why is EF not setting this navigation property?

这篇关于EF Fluent API多对一关系,导航属性未被提取的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆