EF Fluent API多对一关系,导航属性未被提取 [英] EF Fluent API many to one relation, navigation property is not fetched
问题描述
这是以下关系:
如你所见,我有一个练习
,它与 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> 在默认构造函数中实例化导航参考属性会导致各种奇怪的问题,例如:一个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: As you can see, I have a The problem is that there is no error for me to google on. The entities are fetched, but the related I am using the following query to force the Is there someting wrong with the relationship I created? Or is there something wrong with the database configuration perhaps? Code for the entities:
Remove this line from the 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屋!
<新的ExerciseType();
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);
EntityType
property on the Exercise
objects, is never fetched. ExerciseType
to be fetched, but that doesn't seem to make it work either. 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
constructor:this.ExerciseType = new ExerciseType();