无法创建“T”类型的常量值。在此上下文中仅支持原始类型(例如Int32,String和Guid')

时间:2012-02-25 18:38:25

标签: entity-framework-4 many-to-many ef-code-first

我看到很多关于这个错误的问题,但是有人可以告诉我为什么我的代码中出现了这个错误? 我的应用程序中有用户和组,他们有很多关系:

public class Group
{
    [Key]
    public int GId { get; set; }

    public string GName { get; set; }

    public virtual ICollection<UserProfile> Members { get; set; }

    public Group()
    {
        Members = new HashSet<UserProfile>();
    }
}
public class UserProfile
{
    [Key]
    public Guid UserId { get; set; }

    [Required]
    public string UserName { get; set; }

    public virtual ICollection<Group> Groups { get; set; }

    public UserProfile()
    {
        Groups = new HashSet<Group>();

    }
}

我想让用户加入的所有群组将其传递给ViewBag,所以:

UserProfile user = core.Profiles.Find(1);
//ok, no error in controller, but view...
ViewBag.JoinGroups = core.Groups.Where(g => g.Members.Contains(user));

但我在View:

中收到错误
@if (ViewBag.JoinGroups != null)
{
    foreach (var g in ViewBag.JoinGroups)//My issue start here
    {
        <p>@g.GId</p>
    }
}

它说:

  

无法创建“Project.Model.UserProfile”类型的常量值。   仅支持原始类型(例如Int32,String和Guid')   在这种情况下。

我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

消息很明确:EF Linq查询不支持传递实体。

您可以通过更改此部分来解决此问题:

UserProfile user = core.Profiles.Find(1);
ViewBag.JoinGroups = core.Groups.Where(g => g.Members.Contains(user));

为此:

ViewBag.JoinGroups = core.Groups.Where(g => g.Members.Select(x => x.UserId)
                                                     .Contains(1));

答案 1 :(得分:1)

这不是ViewBag或其他任何内容。这只是延迟的执行陷阱:直到foreach是执行的查询。您之前可以通过core.Groups.Where(g => g.Members.Contains(user)).ToList();看到异常。

顺便提一下,很明显你已经在实体框架中知道了referencing non-scalar variables is not supported,但是为了完整起见,请允许我提及它。