我有一个问题涉及基于登录用户在 SQL 数据库(实体框架)中返回数据行的后勤问题;我主要专注于桌面 C# 应用程序,在切换到 ASP.NET MVC 4 时,我在弄清楚这一点时遇到了一些困难(我四处搜索,似乎没有一个答案能提供确切的内容我在找):
我想使用 ASP.NET (MVC4) 内置的授权,并允许用户使用表单发布有关其网站的数据(站点类别、网址、年龄等),并让表单存储数据(使用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 提供的用户类,它看起来像这样:(另外,我知道“密码”不应该是字符串格式,这仅用于初始设置目的 -我认为应该完全删除密码并由 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; }
}
在为 Views 提取数据时,我使用直接注入通过存储库运行所有内容:
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 并将其添加到表中。