2013-10-13 105 views
0

我有一个问题,涉及基于登录的用户在SQL数据库(实体框架)中返回数据行的后勤问题;我主要关注桌面C#应用程序,同时切换到ASP.NET MVC 4,在解决这个问题时我遇到了一些困难(我已经搜索过,没有一个答案似乎提供了正确的我正在寻找):显示基于当前登录用户的具体数据

我想使用内置到ASP.NET(MVC4)的授权,并允许用户发布关于他们的网站(网站类别,网址,年龄等)的数据与表单,并将表单(使用实体框架)存储到与UserProfile表中的Id相关联的数据库(称为PrimaryDomainsDb)中。

当用户点击一个按钮来显示他们的域列表时,我怎么能让应用程序拉他们的域列表(相关的数据行),而忽略其他用户的行?

同样,我主要是寻找物流和概念(例如使用外键)和psuedocode,而不是实际上将一堆代码喂给我。

如果任何人有任何的最佳做法的想法(即这样链接的用户配置到PrimaryDomainDb ,并使用EF调用行匹配其ID 这样将行返回到View),这将是非常感激。

一些示例代码:

目前,我有我的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; } 
} 

我有一个User类与ASP.NET WebSecurity提供的类不同,它看起来像这样:(另外,我知道“password”不应该是字符串格式,这只是用于初始设置目的 - 我认为应该可以完全删除并由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列表,而是想添加一种方法来引用当前登录的用户标识,以使应用程序仅显示该特定用户的域,而不是所有域,以及通过表单添加新域以引用用户标识并将其添加到表中时。

回答

0

这可能是你在找什么。如果我正确地理解了你,你想使用WebSecurity来登录或注册用户,但你想使用实体框架来存储一些用户特定的数据。下面的代码将WebSecurity表与使用EntityFramework创建的数据库CodeFirst连接起来。

您可以在下面创建课程(来自教程)。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
    public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute 
    { 
     private static SimpleMembershipInitializer _initializer; 
     private static object _initializerLock = new object(); 
     private static bool _isInitialized; 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      // Ensure ASP.NET Simple Membership is initialized only once per app start 
      LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); 
     } 

     private class SimpleMembershipInitializer 
     { 
      public SimpleMembershipInitializer() 
      { 
       try 
       { 
        if(!WebSecurity.Initialized) 
         WebSecurity.InitializeDatabaseConnection("ConnectionString", "DbUsers", "UserId", "Email", autoCreateTables: true); 
       } 
       catch (Exception ex) 
       { 
        throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex); 
       } 
      } 
     } 
    } 

它创建了注册和记录您的用户所需的表格。魔法在第二,第三和第四个参数。它分别来自您的数据库的table,userId列和userName列,您可以通过EntityFramework创建该列。 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; } 
} 

然后,你可以简单地从控制器查询数据。在下面的示例中,我使用由WebSecurity成员存储的UserId从数据库检索帐户信息。

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如上整合的事实了解(我也忘了提,创造InitializeSimpleMmebershipAttribute类如上面后,你需要用这个属性来装饰你的控制器),你在实现通用库方面也有问题。如果该行是一个问题:

var allDomains = _db.PrimaryDomains; 

话,我建议阅读这篇文章关于实施通用仓库:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

如果你想要的东西真的简单,所有你需要的只是添加到您的界面方法

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(); 
    } 
} 

但这是非常糟糕的做法,我强烈建议阅读该文章。

+0

谢谢你的回复,它确实有助于清理一些东西。我已经编辑了上面的问题来展示一些代码,并添加了更多关于我正在尝试做的事情,如果您可以给我一些关于上述代码的提示,将非常感谢! – drewness

+0

看我更新的帖子 – VsMaX

+0

好的,谢谢你的资源,这个链接是非常深入的,我会明天通过它并应用它并报告回来。在那之前,我试图实现上面提供的所有代码,但是当将AccountInfo ActionResult添加到控制器时,我按照前面所述装饰了控制器,但代码无法解析上下文中的“上下文”和“映射器”。 Users.FirstOrDefault ...&Mapper.Map 。)部分。我确信这个错误是一个简单的修复,但我很难过。希望通过明天提供的链接可以简化事情 - 无论如何,感谢您的帮助。 – drewness

0

我原来的问题可能会造成一些混淆,我试图达到什么;这是我的错,因为我想要做的事情会走错方向。经过大量研究和学习,我发现我正在寻找的是多租户数据架构方法。