在此上下文中仅支持原始类型或枚举类型 - 实体框架

时间:2014-05-18 06:02:17

标签: c# asp.net asp.net-mvc entity-framework

我正在使用enitity框架制作测试博客应用程序,并遇到了这个错误:

  

"无法创建类型' TestBlog.Models.Tag'的常量值。只要   在此上下文中支持原始类型或枚举类型。"

我正在使用asp.net MVC,其中viewmodels在我的视图和控制器之间传递数据。

在我的ActionResult编辑帖子的控制器中,我有这样的说法:

return View("Form", new PostsForm
    {

        Tags = TestBlog.Tags.Select(tag => new TagCheckBox
        {
            Id = tag.Id,
            Name = tag.Name,
            IsChecked = post.Tags.Contains(tag)
        }).ToList() 
    });

我也试过这个版本:

return View("Form", new PostsForm
    {
        Tags = (from item in TestBlog.Tags
                select item).Select(tag => new TagCheckBox
                {
                    Id = tag.Id,
                    Name = tag.Name,
                    IsChecked = post.Tags.Contains(tag)
                }).ToList()
    });

问题似乎是由以下原因造成的:

  

IsChecked = post.Tags.Contains(tag)

当我评论该声明时,它不再显示错误。

这是我的Tag.cs​​模型

public class Tag
{
    public Tag()
    {
        this.Posts = new HashSet<Post>();
    }

    public int Id { get; set; }
    public string Slug { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Post> Posts { get; set; }
}

这是我的viewmodels:

public class TagCheckBox
{
    public int? Id { get; set;}
    public string Name { get; set; }
    public bool IsChecked { get; set;}
}

public class PostsForm
{
    public bool IsNew { get; set; }
    public int? PostId { get; set; }

    [Required, MaxLength(128)]
    public string Title { get; set; }

    [Required, MaxLength(128)]
    public string Slug { get; set; }

    [Required, DataType(DataType.MultilineText)]
    public string Content { get; set; }

    public IList<TagCheckBox> Tags { get; set; }
}

非常感谢任何建议。

谢谢

2 个答案:

答案 0 :(得分:1)

IsChecked = post.Tags.Select(x => x.Id).Contains(tag.Id)

<强>更新

但实际上,设置了导航属性属性后,您应该可以调用:

Tags = post.Tags.Select(x => new TagCheckBox { Id = x.Id, Name = x.Name, IsChecked = x.IsChecked }).ToList();

答案 1 :(得分:1)

EF不知道您的类TagCheckBox,也无法在SQL中创建它的实例。试试吧。

(无法通过手机设置格式,道歉)。

return View("Form", new PostsForm
    {
        Tags = (from item in TestBlog.Tags
                select item).Select(tag => new
                {
                    Id = tag.Id,
                    Name = tag.Name,
                    IsChecked = post.Tags.Any(t => t.Id == tag.Id)
                }).
                .AsEnumerable()
                .Select(tag => new TagCheckBox
                {
                    Id = tag.Id,
                    Name = tag.Name,
                    IsChecked = tag.IsChecked
                })
                .ToList()
    });