2

У меня есть база данных с Entity Framework 5 RC (с Fluent API), работающая сейчас, но я не могу получить определенное отношение к работе. И это заводит меня за последние несколько ночей, над которыми я работаю.EF Fluent API от нескольких до одного отношения, свойство навигации не выбрано

Это соотношение:

Link to the database diagram

Как вы можете видеть, у меня есть Exercise, который связан с ExerciseType. Проблема в том, что свойство навигации Exercise.ExerciseType не загружено. Соотношение I сделано следующим образом:

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

Там ничего плохого в вашем коде. Странная проблема. Является ли значение «ExerciseTypeId» недействительным в базе данных и у вас есть принудительное ограничение внешнего ключа для отношений в БД? Учитываются ли упражнения в существующих вариантах осуществления в базе данных? – Slauma

ответ

2

Удалить эту строку из 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?

+0

Это действительно решило проблему. Когда я строил отношения с типами ICollection как свойство, я думал, что это не вредно. Теперь я знаю, что могу с ICollections, и не могу с одиночными объектами. Или мне нужно удалить еще две инициализации? Потому что они работают нормально, насколько я знаю. Благодарим вас за помощь и понимание. – Roet

+0

@Roet: Создание пустых коллекций не представляет проблемы. – Slauma

0

могли бы вы предоставить код из EntityType класса? У меня была такая же проблема с EF 4.3.1 сегодня, когда я забыл сделать свойство (ExerciseType в вашем случае) virtual. Если это не так, укажите код класса в конце концов.

Если вы используете функцию ленивой загрузки, ваши объекты должны иметь свойства навигации, помеченные как виртуальные. EF генерирует класс прокси, наследующий от вашей сущности, и если свойство не является виртуальным, производный класс не может обеспечить его собственную реализацию этого свойства (реализация, которая должна лениво загружать связанный объект/коллекцию).

+0

Я их отмечен как виртуальный, так как я знаю об этом. Но у вас есть хорошая точка зрения. Я добавил код объектов на вопрос, вы могли бы заметить что-то еще. – Roet