@neuralink7232050

Как разобраться с внешним ключом?

Имеется уже готовая БД, заполненная. Code first не нужен.
Есть сущности Message, User, Operator
public class Message
{
    public int MessageID { get; set; }
    public string Text { get; set; }
    public int UserID { get; set; }
    public User User{ get; set; }
    public int OperatorID { get; set; }
    public virtual Operator Operator { get; set; }
}

public class User
{
    public int UserID { get; set; }
    public string Name { get; set; }
}

public class Operator
{
    public int OperatorID { get; set; }
    public string Name { get; set; }
}


Схема БД такая:
CREATE TABLE [dbo].[Messages] (
    [MessageID]  INT      IDENTITY (1, 1) NOT NULL,
    [OperatorID] INT      NOT NULL,
    [UserID]   INT      NOT NULL,
    [Text]       TEXT     NOT NULL,
    PRIMARY KEY CLUSTERED ([MessageID] ASC),
    CONSTRAINT [FK_Operator] FOREIGN KEY ([OperatorID]) REFERENCES [dbo].[Operators] ([OperatorID]),
    CONSTRAINT [FK_User] FOREIGN KEY ([UserID]) REFERENCES [dbo].[Users] ([UserID])
);


Вопрос вот в чём: Во время выполнения программы создаются экземпляры классов Operator, User и Message и нужно добавить в БД этот Message. Делаю так - dbContext.Messages.Add(new Message(... бла бла)); db.SaveChanges();
В БД запись появляется и UserId и OperatorId подхватываются из свойств созданных экземпляров.
Но проблема в том, что когда мне нужно выгрузить данные из БД, то EF не понимает как в Message инициализировать свойства: public Operator Operator {get; set;} и public User User{get; set;}. Поэтому они всегда NULL. Приходится по свойствам UserId и OperatorId в dbContext'е искать. Инет перерыл, но не нашел. Буду благодарен любому ответу.
  • Вопрос задан
  • 56 просмотров
Решения вопроса 1
hekkaaa
@hekkaaa
Junior DevOps and C#/.NET Developer
Привет!
Если я верно все понял, то вам нужно просто использовать явно в запросе к БД метод .Include() который достанет указанный дочерний элемент из таблицы.
Вот пример для наглядности:
var even = _context.Event
                    .Include(e => e.Clients)
                     .Include(co => co.Company)
                    .FirstOrDefault(e => e.Training.Id == trainingId && e.StartDate == null);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы