1

いくつかのチュートリアルを説明しましたが、ログインしたユーザーを利用して情報をデータベースに保存する方法がすべて省略されているようです。私の要点を説明するために、私が使用してきたモデルを次に示します。

public class Note
{
        public int ID { get; set; }
        public int UserId { get; set; }
        public string Text { get; set; }
}

これにより、各ユーザーはデータベースにメモを書き込むことができます。このモデルの CRUD コントローラーを作成したとき、更新/作成時にUserIdプロパティをWebSecurity.CurrentUserIdに更新しました。次に、データを取得するときに、linq 式で Where を使用してメモをフィルター処理します。何らかの理由で、これは単に間違っているように感じます。

さらに多くの例をトローリングすると、誰かがそうしているのに出くわしました。

public class Note
{
        public int ID { get; set; }
        public virtual UserProfile User { get; set; } 
        public string Text { get; set; }
}
public class NoteDbContext : DbContext
{
    public DbSet<Note> Notes { get; set; }
}

モデルが C# で適切にリンクされているため、これはかなりきれいに見えます。そして、うわー、それは実際に構築されます!したがって、コントローラーで最初にデータベースからユーザー オブジェクトを取得し、次に Where リストを使用してメモを取得します。

//First get the logged in user
var user = dbUser.UserProfiles.Where(x => x.UserId == WebMatrix.WebData.WebSecurity.CurrentUserId).First();
//Now get all their notes
var notes = db.Notes.Where(x => x.User == user);

失敗メッセージ

ただし、これは予期せず失敗します。では、データベース内の他のオブジェクトに対して UserProfile オブジェクトを保存するための良い方法のサンプルを誰か提供してもらえませんか? 基本的に、UserProfile オブジェクトを Note オブジェクトにリンクできるようになったことと、特定の UserId の Notes を適切にクエリする方法を示す良い例が必要です。

4

2 に答える 2

0

各ユーザーは多くのメモを持つことができますよね? その場合は、クラスを次のように変更します。

public class Note
{        
    public int ID { get; set; }
    public int UserId { get; set; }
    public string Text { get; set; }

    public virtual UserProfile User { get; set; }
}

[Table("UserProfile")]
public class UserProfile
{
    public UserProfile()
    {
        this.Notes = new HashSet<Note>();
    }

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }

    public virtual ICollection<Note> Notes{ get; set; }
}

ここで、ユーザーとメモを正しく接続します。したがって、次のように簡単に目標を達成できます。また、現在のユーザーを取得するために苦労する必要もありませんWebMatrix.WebData.WebSecurity! ちょうど使用User.Identity.Name

// ...
var notes = db.Notes.Where(x => x.User.UserName == User.Identity.Name).AsQueryable();
于 2013-07-22T15:13:37.397 に答える
0

関係を定義した方法は、Noteと の間に 1 対 1 の関係を作成することですUser。問題が発生しているクエリに基づいて、ユーザーが複数のメモを持つことができると思います。したがって、ユーザーとそのメモの間に 1 対多を作成するには、UserProfileオブジェクトにコレクションを作成する必要があります。例えば、

public class UserProfile
{
   ...
   public List<Note> Notes {get; set;}
}

...そしてクエリを実行し、Notesそのユーザーに関連付けられたものをロードし、

var user = myUsers.Include(n=>n.Notes)
                  .Single(x => x.UserId == WebMatrix.WebData.WebSecurity.CurrentUserId);
于 2013-07-19T18:38:39.360 に答える