5

登録と oAuth 認証のために MVC 4 テンプレートで使用される WebSecurity 機能によって使用されるエンティティ 'UserProfile' に関連するカスタム モデル (ブログ投稿など) を作成しようとしています。

以下の例:

public class Post
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Detail { get; set; }
    public UserProfile User { get; set; }
}

次のように、現在の UserProfile をブログ投稿に正しく関連付けることができます。

post.User = user = db.UserProfiles.FirstOrDefault(u => u.UserName.ToLower() == WebSecurity.CurrentUserName);
db.Posts.Add(post);
db.SaveChanges();

しかし、データベースからブログ投稿を取得しようとすると、ユーザーの null オブジェクトが取得されます。

var post = db.Posts.Where(x => x.Id == postId).FirstOrDefault();
post.User is null!

これは、SimpleMembershipProvider が以下で作成されたときにデータベースで作成された関係によるものだと思います。

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "Id", "UserName", autoCreateTables: true);

これを克服するには、これらを無視するか、ブログ クラスの User プロパティに属性を追加する方法が必要だと思いますか?

前もって感謝します。

4

1 に答える 1

0

熱心な読み込みを使用していないため (.include を使用するなど)、User プロパティをvirtualにする必要があるため、EF によって遅延読み込みが可能になります (デフォルトでは、DataContext に対して遅延読み込みが有効になっているため、これを変更しなかった場合、遅延読み込みが機能するはずです)。

public class Post
{
    ...
    public virtual UserProfile User { get; set; } // navigation properties need to be virtual to support lazy loading
    ...
}

遅延読み込みが必要ない場合は、Navigation (および熱心な読み込みを実行する) プロパティを含める必要があります。次に例を示します。

var postWithUser = db.Posts
                           .Include(p => p.User)
                           .Where(x => x.Id == postId)
                           .FirstOrDefault();

レイジー/イーガーローディングに関するこの記事が興味深いかもしれません(または、単に EF とレイジー/イーガーローディングをググってください)。

于 2012-12-11T21:53:20.567 に答える