Sql server 显示基于当前登录用户的特定数据
我有一个问题,涉及基于登录用户返回SQL数据库(实体框架)中数据行的逻辑;我主要关注桌面C#应用程序,在切换到ASP.NET MVC 4的过程中,我很难弄明白这一点(我四处搜索,没有一个答案能提供我想要的): 我希望使用ASP.NET(MVC4)中内置的授权,允许用户使用表单发布有关其网站的数据(网站类别、url、年龄等),并让表单将数据(使用实体框架)存储到数据库(称为PrimaryDomainsDb),该数据库与UserProfile表中的Id相关联 当用户单击按钮以显示其域列表时,我如何让应用程序在忽略其他用户行的同时提取其域列表(相关数据行) 同样,我主要是寻找逻辑和概念(例如使用外键)和伪代码,而不是实际上用勺子喂我一堆代码 如果任何人有任何最佳实践想法(即,以这种方式将UserProfile链接到PrimaryDomainDb,并使用EF以这种方式调用与其Id匹配的行以将行返回到视图),我们将不胜感激 一些示例代码: 目前,我的PrimaryDomain代码首先是这样设置的(这没有指定最小/最大长度等的装饰器): 我有一个不同于ASP.NET WebSecurity提供的用户类,它看起来是这样的:(另外,我知道“密码”不应该是字符串格式,这只是为了初始设置的目的——我认为密码可能应该被完全删除并由WebSecurity处理) 在为视图提取数据时,我使用直接注入在存储库中运行所有内容:Sql server 显示基于当前登录用户的特定数据,sql-server,entity-framework,asp.net-mvc-4,Sql Server,Entity Framework,Asp.net Mvc 4,我有一个问题,涉及基于登录用户返回SQL数据库(实体框架)中数据行的逻辑;我主要关注桌面C#应用程序,在切换到ASP.NET MVC 4的过程中,我很难弄明白这一点(我四处搜索,没有一个答案能提供我想要的): 我希望使用ASP.NET(MVC4)中内置的授权,允许用户使用表单发布有关其网站的数据(网站类别、url、年龄等),并让表单将数据(使用实体框架)存储到数据库(称为PrimaryDomainsDb),该数据库与UserProfile表中的Id相关联 当用户单击按钮以显示其域列表时,我如何让
public interface IUserDataSource
{
IQueryable<User> Users { get; }
IQueryable<PrimaryDomain> PrimaryDomains { get; }
void Save();
}
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列表,而是想添加一种引用当前登录用户id的方法,使应用程序只显示该特定用户的域,而不是所有域,当通过表单添加新域以引用用户Id并将其添加到表中时。这可能就是您要查找的内容。如果我理解正确的话,您希望使用WebSecurity来登录或注册用户,但您希望使用EntityFramework来存储一些特定于用户的数据。下面的代码将WebSecurity表与首先使用EntityFramework创建的数据库代码连接起来 您可以在下面创建类(来自教程) 它会创建必要的表来注册和记录用户。神奇之处在于第二、第三和第四个参数。EntityFramework可以从数据库中分别创建表、userId列和userName列。WebSecurity使用该表和其他自行生成的表来管理用户,并允许他们注册、登录等 然后首先在代码中创建表
public class DbUser
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
[MaxLength(40)]
public string Email { get; set; }
[MinLength(3)]
[MaxLength(30)]
[Required]
public string FirstName { get; set; }
[MinLength(3)]
[MaxLength(50)]
[Required]
public string LastName { get; set; }
}
然后您可以简单地从控制器查询数据。在下面的示例中,我使用WebSecurityMembership存储的用户ID从数据库中检索帐户信息
public ActionResult AccountInfo()
{
if (FormsAuthentication.CookiesSupported == true && Request.Cookies[FormsAuthentication.FormsCookieName] != null)
{
var userId = WebSecurity.CurrentUserId;
var userInfo = context.Users.FirstOrDefault(x => x.UserId == userId);
userInfo.Password = "";
return View(userInfo);
}
else
{
ModelState.AddModelError("", "Wystąpił bląd autoryzacji, zaloguj się jeszcze raz.");
return RedirectToAction("Login", "Account");
}
}
编辑:
关于您编辑的问题,据我所知,除了您需要如上所述将WebSecurity与EF集成(我还忘记了在如上所述创建InitializeSamplemberShipAttribute类之后,您需要使用该属性装饰控制器)之外,您在实现泛型存储库方面也存在问题。如果该线路存在问题:
var allDomains = _db.PrimaryDomains;
然后,我建议阅读这篇关于实现通用存储库的文章:
若你们想让事情变得简单,你们所需要的只是添加到你们的接口方法中
GetDomainByUserId(int userId)
只需实现这样的接口:
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; }
}
IQueryable<PrimaryDomain> GetDomainByUserId(int userId)
{
return PrimaryDomains.Where(x => x.Id == userId).ToQueryable();
}
void IUserDataSource.Save()
{
SaveChanges();
}
}
公共类UserDb:DbContext,IUserDataSource
{
公共用户数据库()
:base(“默认连接”)
{
}
公共数据库集用户{get;set;}
公共DbSet PrimaryDomains{get;set;}
IQueryable IUserDataSource.Users
{
获取{返回用户;}
}
IQueryable IUserDataSource.PrimaryDomains
{
获取{返回PrimaryDomains;}
}
IQueryable GetDomainByUserId(int userId)
{
返回PrimaryDomains.Where(x=>x.Id==userId.ToQueryable();
}
void IUserDataSource.Save()
{
保存更改();
}
}
但这是一种非常糟糕的方法,我强烈建议阅读这篇文章。我最初的问题可能会让人对我想要实现的目标产生一些困惑;这是我的错,因为我对我要做的事情采取了错误的方式。经过大量的研究和学习,我发现我正在寻找的正是一种多租户数据体系结构方法。感谢您的回复,它确实有助于澄清一些问题。我已经编辑了上面的问题来展示一些代码,并添加了一些关于我正试图做的事情,如果你能给我一些关于上面代码的提示,我将不胜感激!好的,谢谢你提供的资源,这个链接非常深入,我明天会浏览并应用它,然后再报告。在此之前,我尝试实现上面提供的所有代码,但在将AccountInfo ActionResult添加到控制器时,我按照您所述修饰了控制器,但代码无法解析“context”和“Mapper”(来自context.Users.FirstOrDefault…&Mapper.Map.)部分。我确信这个错误是一个简单的解决办法,但我被难住了。希望通过您明天提供的链接可以简化事情——不管怎样,谢谢您的帮助。context是我的DbContext实例,mapper只是我要重新映射的类,您不应该同时复制我的代码。这只是使用dbContext的一个示例,这样您就可以根据用户ID从数据库中检索一些数据。我将很快删除不必要的代码。
public ActionResult AccountInfo()
{
if (FormsAuthentication.CookiesSupported == true && Request.Cookies[FormsAuthentication.FormsCookieName] != null)
{
var userId = WebSecurity.CurrentUserId;
var userInfo = context.Users.FirstOrDefault(x => x.UserId == userId);
userInfo.Password = "";
return View(userInfo);
}
else
{
ModelState.AddModelError("", "Wystąpił bląd autoryzacji, zaloguj się jeszcze raz.");
return RedirectToAction("Login", "Account");
}
}
var allDomains = _db.PrimaryDomains;
GetDomainByUserId(int userId)
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; }
}
IQueryable<PrimaryDomain> GetDomainByUserId(int userId)
{
return PrimaryDomains.Where(x => x.Id == userId).ToQueryable();
}
void IUserDataSource.Save()
{
SaveChanges();
}
}