ログインしているユーザーに基づいて SQL データベース (Entity Framework) でデータの行を返すロジスティクスを扱う質問があります。私は主にデスクトップ C# アプリケーションに焦点を当ててきましたが、ASP.NET MVC 4 に切り替えている間、これを理解するのに少し苦労しています (私は周りを検索しましたが、どの回答も正確に何を提供しているようには見えません)を探しています):
ASP.NET (MVC4) に組み込まれている承認を使用して、ユーザーが自分の Web サイトに関するデータ (サイト カテゴリ、URL、年齢など) をフォームに投稿できるようにし、フォームにデータを保存できるようにしたいと考えています ( Entity Framework) を、UserProfile テーブルの Id に関連付けられているデータベース (PrimaryDomainsDb と呼ばれる) に接続します。
ユーザーがボタンをクリックしてドメインのリストを表示するとき、他のユーザーの行を無視してアプリケーションにドメインのリスト (関連するデータ行) を取得させるにはどうすればよいですか?
繰り返しになりますが、私は主に、実際に大量のコードをスプーンフィードするのではなく、ロジスティクスと概念 (たとえば、外部キーを使用) と疑似コードを探しています。
誰かがベスト プラクティスのアイデアを持っている場合 (つまり、UserProfile をこの方法で PrimaryDomainDb にリンクし、EF を使用して ID に一致する行をこの方法で呼び出し、行をビューに返す)、大歓迎です。
サンプルコード:
現在、PrimaryDomain コードを最初に次のように設定しています (これには、最小/最大長などを指定するデコレータはありません)。
public class PrimaryDomain
{
public virtual int Id { get; set; }
public virtual string SiteName { get; set; }
public virtual string SiteURL { get; set; }
public virtual SitePlatforms SitePlatform { get; set; }
public virtual decimal? SiteDA { get; set; }
public virtual decimal? SitePA { get; set; }
public virtual string SiteAge { get; set; }
public virtual DateTime? LastStatusUpdate { get; set; }
public virtual string SiteIP { get; set; }
}
そして、ASP.NET WebSecurity によって提供されるものとは異なる User クラスがあります。これは次のようになります:パスワードはおそらく完全に削除して、WebSecurity で処理する必要があると思います)。
public class User
{
public virtual int Id { get; set; }
public virtual string Username { get; set; }
public virtual string Password { get; set; }
public virtual string Email { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string MozAccessID { get; set; }
public virtual string MozKey { get; set; }
public virtual decimal AccuountBalance { get; set; }
public virtual PrivateProxy PrivateProxies { get; set; }
public virtual PrimaryDomain PrimaryDomains { get; set; }
}
ビューのデータをプルするときは、直接注入を使用してリポジトリを介してすべてを実行します。
public interface IUserDataSource
{
IQueryable<User> Users { get; }
IQueryable<PrimaryDomain> PrimaryDomains { get; }
void Save();
}
これは私の UserDb クラスで、コードが IUserDataSource を呼び出すたびに (直接インジェクションを介して) フィードされます。
public class UserDb : DbContext, IUserDataSource
{
public UserDb()
: base("DefaultConnection")
{
}
public DbSet<User> Users { get; set; }
public DbSet<PrimaryDomain> PrimaryDomains { get; set; }
IQueryable<User> IUserDataSource.Users
{
get { return Users; }
}
IQueryable<PrimaryDomain> IUserDataSource.PrimaryDomains
{
get { return PrimaryDomains; }
}
void IUserDataSource.Save()
{
SaveChanges();
}
}
これは、たとえば、PrimaryDomains モデルをビューに渡す方法です。
public class NetworkController : Controller
{
//
// GET: /Network/
private IUserDataSource _db;
public NetworkController(IUserDataSource db)
{
_db = db;
}
public ActionResult ListDomains()
{
var allDomains = _db.PrimaryDomains;
return View(allDomains);
}
}
しかし、PrimaryDomains リスト全体をデータ ソースから取得する代わりに、現在ログインしているユーザー ID を参照して、すべてのドメインではなく、その特定のユーザーのドメインのみをアプリケーションに表示させる方法を追加したいと考えています。ユーザー ID を参照し、それをテーブルにも追加するフォームを介してドメイン。