使用具有两个相关实体的ViewModel创建

时间:2011-12-17 00:57:11

标签: asp.net-mvc-3 entity-framework-4.1

我在ViewModel中拥有两个实体的属性。这两个实体彼此相关,例如,用户和帖子。每个用户可以有多个帖子,许多帖子可以属于一个用户(一对多)。

我的ViewModel的目标是允许在同一表单上添加User和Post。所以我的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);

更新

我的Post类代码如下:

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 个答案:

答案 0 :(得分:1)

问题是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*/);