Создать с помощью ViewModel, которая имеет две связанные сущности - PullRequest
1 голос
/ 17 декабря 2011

У меня есть свойства для двух объектов в ViewModel. Оба объекта связаны друг с другом, например, Пользователь и Сообщения. Каждый пользователь может иметь несколько сообщений, и многие сообщения могут принадлежать одному пользователю (один ко многим).

Цель моей ViewModel - разрешить добавление пользователя и сообщения в одной форме. Так что моя ViewModel выглядит примерно так:

public class CreateVM
{
    [Required, MaxLength(50)]
    public string Username { get; set; }

    [Required, MaxLength(500), MinLength(50)]
    public string PostBody { get; set; }

    // etc with some other related properties
}

В моем контроллере по методу создания у меня есть что-то вроде этого:

[HttpPost]
public ActionResult Create(CreateVM vm)
{
    if (ModelState.IsValid)
    {
            User u = new User()
            {
                Username = vm.Username,
                // etc populate properties
            };

            Post p = new Post()
            {
                Body = vm.PostBody,
                // etc populating properties
            };

            p.User = u; // Assigning the new user to the post.

            XContext.Posts.Add(p);

            XContext.SaveChanges();
    }
}

Все выглядит нормально, когда я прохожу его через отладчик, но когда я пытаюсь просмотреть сообщение, его пользовательские отношения равны нулю !!

Я тоже пытался

u.Posts.Add(p);

UPDATE

Код класса «Мой пост» выглядит следующим образом:

public class Post
{
    [Key]
    public int Id { get; set; }
    [Required, MaxLength(500)]
    public string Body { get; set; }
    public int Likes { get; set; }
    [Required]
    public bool isApproved { get; set; }
    [Required]
    public DateTime CreatedOn { get; set; }
    [Required]
    public User User { get; set; }
}

Но это тоже не сработало. Что я делаю неправильно ? Я очень ценю любую помощь .

Спасибо.

1 Ответ

1 голос
/ 17 декабря 2011

Проблема в том, что EF не может лениво загрузить свойство User, поскольку вы не сделали его virtual.

public class Post
{
    [Key]
    public int Id { get; set; }
    [Required, MaxLength(500)]
    public string Body { get; set; }
    public int Likes { get; set; }
    [Required]
    public bool isApproved { get; set; }
    [Required]
    public DateTime CreatedOn { get; set; }
    [Required]
    public virtual User User { get; set; }
}

Если вы заранее знаете, что собираетесь получить доступ к Userсвойство сообщения, которое вы должны загрузить User, связанное с сообщением.

context.Posts.Include("User").Where(/* condition*/);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...