2013-10-13 36 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

我原來的問題可能會造成一些混淆,我試圖達到什麼;這是我的錯,因爲我想要做的事情會走錯方向。經過大量研究和學習,我發現我正在尋找的是多租戶數據架構方法。