Порт Entityframework от модели сначала к коду сначала - PullRequest
0 голосов
/ 20 марта 2012

Я все еще пытаюсь перейти от реализации EntityFramework от Model First к Code First Я добился значительного прогресса с помощью Eranga. Я столкнулся с еще одной загадкой, и я просто не могу объяснить, что происходит. У меня есть два объекта Entity Тема и курс

  • В теме может быть один обязательный курс
  • Курс может иметь 0 или более тем

когда я выполняю следующий linq, он генерирует странный SQL

    var topics = from o in db.Topics where o.ParentTopic == null && 
            o.Course.Id == c.Id select o;

Сгенерированный SQL

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[Name] AS [Name], 
[Extent1].[ShortDescription] AS [ShortDescription], 
[Extent1].[LongDescription] AS [LongDescription], 
[Extent1].[Property] AS [Property], 
[Extent1].[Difficulty] AS [Difficulty], 
[Extent1].[Weight] AS [Weight], 
[Extent1].[Course_Id] AS [Course_Id], 
[Extent1].[ParentTopic_Id] AS [ParentTopic_Id], 
[Extent1].[Course_Id1] AS [Course_Id1]
FROM [dbo].[Topics] AS [Extent1]
WHERE ([Extent1].[ParentTopic_Id] IS NULL) AND ([Extent1].[Course_Id] = @p__linq__0)

Обратите внимание, что есть добавленное поле Course_Id1, которого нет в моем объекте и не объявлено как внешний ключ. Я думал, что в OnModelCreating () я правильно определил родительско-дочерние отношения с обеих сторон (я бы подумал, что вам нужно только сделать это с любой стороны), но я не могу заставить EntityFramework не генерировать дополнительное поле, которое, очевидно, не существует в базе данных. Помните, что моя база данных изначально была создана с использованием подхода ModelFirst.

Может кто-нибудь объяснить, откуда берется дополнительное поле ????

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //Topic
        modelBuilder.Entity<Topic>()
            .HasRequired(m => m.Course)
            .WithMany(m=>m.Topics)
            .HasForeignKey(m => m.Course_Id);
        modelBuilder.Entity<Topic>()
            .HasOptional(m => m.ParentTopic)
            .WithMany(m => m.ChildTopics)
            .HasForeignKey(m => m.ParentTopic_Id);

        //////// lots of code removed for brevity. //////

        modelBuilder.Entity<Course>()
            .HasMany(m=>m.Topics)
            .WithRequired(m => m.Course)
            .HasForeignKey(m => m.Course_Id);
    }


public partial class Topic
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public string ShortDescription { get; set; }
    public string LongDescription { get; set; }
    public string Property { get; set; }
    public double? Difficulty { get; set; }
    public double? Weight { get; set; }

    [JsonIgnore]
    public virtual Course Course { get; set; }
    public int Course_Id { get; set; }

    [JsonIgnore]
    public virtual ICollection<Question> Questions { get; set; }

    [JsonIgnore]
    public virtual ICollection<Topic> ChildTopics { get; set; }

    [JsonIgnore]
    public virtual Topic ParentTopic { get; set; }
    public int? ParentTopic_Id { get; set; }

    [JsonIgnore]
    public virtual ICollection<RTIQueueEntryData> RTIQueueEntryData { get; set; }

    [JsonIgnore]
    public virtual ICollection<Intervention> Interventions { get; set; }

    [JsonIgnore]
    public virtual ICollection<RtiStudentGroup> RtiStudentGroups { get; set; }
}

public partial class Course
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    public string Description { get; set; }
    public string Version { get; set; }
    public string Year { get; set; }
    public string ImportedId { get; set; }
    [Required]
    public string LocalCourseNumber { get; set; }
    [Required]
    public string NCESCourseNumber { get; set; }
    [Required]
    public string StateCourseNumber { get; set; }
    public int? Grade { get; set; }

    [JsonIgnore]
    public virtual ICollection<Topic> PerformanceIndicators { get; set; }

    [JsonIgnore]
    public virtual Department Department { get; set; }
    public int DepartmentId { get; set; }

    [JsonIgnore]
    public virtual ICollection<StudentGroup> StudentGroups { get; set; }

    [JsonIgnore]
    public virtual ICollection<CutPointTemplate> CutPointTemplates { get; set; }

    [JsonIgnore]
    public virtual School School { get; set; }
    public int School_Id { get; set; }

    [JsonIgnore]
    public virtual ICollection<Staff> RTIStaff { get; set; }

    [JsonIgnore]
    public virtual ICollection<Topic> Topics { get; set; }
}

1 Ответ

1 голос
/ 20 марта 2012

У вас есть другое отношение между Course и Topic, созданное соглашением из-за этого свойства навигации:

public virtual ICollection<Topic> PerformanceIndicators { get; set; }

EF поместит (невидимый, не обнаженный) конец отношений в класс Topic. По умолчанию это отношение один ко многим. Следовательно, вы получаете дополнительное свойство внешнего ключа в таблице Topics (= Course_Id1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...