2012-02-25 19 views
2

このエラーについて多くの質問がありますが、なぜこのエラーが発生するのかを教えてください。そう、タイプ 'T'の定数値を作成できません。このコンテキストでは、プリミティブ型( 'Int32、String、およびGuid'など)のみがサポートされています

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

    } 
} 

私はすべてのグループをユーザーが参加ANS 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

メッセージはクリアです。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

これはViewBagなどに固有のものではありません。それはちょうど遅延実行の落とし穴です:foreachが実行されるまでではありません。 core.Groups.Where(g => g.Members.Contains(user)).ToList();を実行すると、先に例外が発生していました。

ところで、エンティティフレームワークでreferencing non-scalar variables is not supportedが既にわかっていることは明らかですが、完全性のために言及することができます。

関連する問題

 関連する問題