@manst
.net

Как сделать навигационые свойства?

Добрый день.

Есть два класса Message и UserProfile, если отбросить лишние то:
//комментариями отмечены поля, как я представлял себе это сделать, но так не работает
public class Message
{
     public int Id {get;set;}
     public string Text {get;set;}
     public int CreatedById {get;set;}
     public int UpdatedById {get;set;}
     
     //public virtual UserProfile CreatedBy {get;set;}
     //public virtual UserProfile UpdatedBy {get;set;}
}

public class UserProfile
{
     public int Id {get;set;}
     public string Name {get;set;}

     //public virtual ICollection<Message> CreatedMessages {get;set;}
     //public virtual ICollection<Message> UpdatedMessages {get;set;}
}

Поскажите, как добавить в классах навигационые свойства, что бы было можно делать так:
var createdByUserName = context.Message.CreatedBy.Name;
var updatedByUserName = context.Message.UpdatedBy.Name;

var createdMessage = context.UserProfile.CreatedMessage.ToList();
var updatedMessage = context.UserProfile.UpdatedMessage.ToList();
  • Вопрос задан
  • 2220 просмотров
Решения вопроса 1
@manst Автор вопроса
.net
Проблему решил добавление атрибута [InverseProperty].
В итоге все выглядит так:
public class Message
    {
        public int Id { get; set; }
        public string Text { get; set; }
        public int CreatedById { get; set; }
        public int ? UpdatedById { get; set; }

        [InverseProperty("CreatedMessages")]
        [ForeignKey("CreatedById")]
        public virtual UserProfile CreatedBy { get; set; }

        [InverseProperty("UpdatedMessages")]
        [ForeignKey("UpdatedById")]
        public virtual UserProfile UpdatedBy {get;set;}
    }

    public class UserProfile
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public virtual ICollection<Message> CreatedMessages {get;set;}
        public virtual ICollection<Message> UpdatedMessages {get;set;}
    }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@eee
Раскомментируйте виртуальные свойства, с ними все в порядке.
Вы неправильно вызываете навигационные свойства. Должно быть так:

// Сначала находим нужное нам сообщение
var message = context.Messages.Find(Id);

// Затем мы можем получить навигационные свойства этой записи
var createdByUserName = message.CreatedBy.Name;
var updatedByUserName = message.UpdatedBy.Name;

// Получить другие сообщения автора данного сообщения
var creatorMessages = message.CreatedBy.CreatedMessages.ToList();
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы