Не могу заставить `Include` работать с ядром EF, без FK - PullRequest
0 голосов
/ 14 января 2019

У меня есть 2 таблицы на сервере SQL без FK:

enter image description here

Так что у каждого Image есть много Comments.

Используя эту команду, я создал файлы скаффолдов:

dotnet ef dbcontext scaffold "Server = SFF-ПК; Database = IMG; Trusted_Connection = True;" Microsoft.EntityFrameworkCore.SqlServer -o Модели -t Изображения -t комментарии --context-dir Context -c MyContext -f

Вот сгенерированные файлы:

 public partial class Images
    {
        public int ImageId { get; set; }
        public Guid ImgGuid { get; set; }
        public string ImgExtension { get; set; }
        public DateTime Datecreated { get; set; }
        public string Origin { get; set; }
        public decimal? Size { get; set; }
        public string Ip { get; set; }
        public int UserId { get; set; }
        public string Description { get; set; }
        public bool? IsActive { get; set; }
        public int? VotesUp { get; set; }
        public int? VotesDown { get; set; }
        public int ImgType { get; set; }
    }

public partial class Comments
{
    public int CommentId { get; set; }
    public int ImageId { get; set; }
    public int UserId1 { get; set; }
    public string CommentTxt { get; set; }
    public DateTime DateCreated { get; set; }
    public bool? IsActive { get; set; }
}

Вопрос:

Используя эти сгенерированные классы и этот полный контекстный файл , Как я могу получить каждый Image и Include его comments?

Что я пробовал:

Я пытался добавить атрибут ForeignKey:

 public partial class Comments
    {
        public int CommentId { get; set; }

        [ForeignKey("Images")]          <--------------Here
        public int ImageId { get; set; }
        public int UserId1 { get; set; }
        public string CommentTxt { get; set; }
        public DateTime DateCreated { get; set; }
        public bool? IsActive { get; set; }
    }

И запустить это:

        var context = new MyContext();
        var result = context.Images.Include("Comments"); //exception

         foreach (var a in result)
         {
             Console.WriteLine(a);
         }

Исключение:

Свойство «Комментарии» не является свойством навигации типа сущности «Изображения»

1 Ответ

0 голосов
/ 14 января 2019

Когда вы используете [ForeignKey("Images")] поверх вашей фк, "Images", как ожидается, будет навигационным свойством внутри вашего Comments класса, а не именем вашего DbSet свойства в вашем DbContext. Вы можете прочитать больше здесь и отношений здесь . В случае, если ваш код основан на определении вашего Comments класса, вам понадобится свойство Images.

[ForeignKey("Images")]          
public int ImageId { get; set; }
public Images Images { get; set; } // ForeignKey attribute points to this

Несмотря на то, что выше показано, как вы можете использовать [ForeignKey("Images")], я бы рекомендовал сделать имя свойства Image вместо Images. Это не только лучшее пояснительное имя, но и лишнее [ForeignKey("Image")]. EF автоматически сопоставит Image с Image id в соответствии с соглашением об именах.

Судя по тому, как вы используете доступ к комментариям с помощью context.Images.Include("Comments"), вы, похоже, пытаетесь получить доступ к списку комментариев под изображением. Однако, если вы заметите, что ваша result переменная будет IQueriable из Images. Для этого вам необходимо добавить свойство навигации в ваш класс Images.

public IEnumerable<Comments> Comments { get; set; }

Поскольку вы уже сопоставили свой внешний ключ, ваше отображение неявно составляет от ImageId до Comments. Тем не менее, вы можете использовать атрибут InverseProperty для обеспечения безопасности (для получения дополнительной информации проверьте ссылку Relationship ). После этого вы можете использовать следующий код:

var result = context.Images.Include(i => i.Comments);
...