Невозможно создать постоянное значение типа 'T'.В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid). - PullRequest
2 голосов
/ 25 февраля 2012

Я вижу много вопросов об этой ошибке, но кто-то может сказать мне, почему я получаю эту ошибку в своем коде?
У меня есть пользователь и группа в моем приложении, они имеют отношения многие ко многим:

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));

Но я получаю ошибку при просмотре:

@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 ]

2 голосов
/ 26 февраля 2012

Сообщение ясно: запросы 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 голос
/ 26 февраля 2012

Это не относится к ViewBag или чему-либо еще.Это просто ловушка отложенного выполнения: до тех пор, пока foreach не будет выполнен запрос.Вы бы видели исключение раньше, выполнив core.Groups.Where(g => g.Members.Contains(user)).ToList();.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...