Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 显示基于当前登录用户的特定数据_Sql Server_Entity Framework_Asp.net Mvc 4 - Fatal编程技术网

Sql server 显示基于当前登录用户的特定数据

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相关联 当用户单击按钮以显示其域列表时,我如何让

我有一个问题,涉及基于登录用户返回SQL数据库(实体框架)中数据行的逻辑;我主要关注桌面C#应用程序,在切换到ASP.NET MVC 4的过程中,我很难弄明白这一点(我四处搜索,没有一个答案能提供我想要的):

我希望使用ASP.NET(MVC4)中内置的授权,允许用户使用表单发布有关其网站的数据(网站类别、url、年龄等),并让表单将数据(使用实体框架)存储到数据库(称为PrimaryDomainsDb),该数据库与UserProfile表中的Id相关联

当用户单击按钮以显示其域列表时,我如何让应用程序在忽略其他用户行的同时提取其域列表(相关数据行)

同样,我主要是寻找逻辑和概念(例如使用外键)和伪代码,而不是实际上用勺子喂我一堆代码

如果任何人有任何最佳实践想法(即,以这种方式将UserProfile链接到PrimaryDomainDb,并使用EF以这种方式调用与其Id匹配的行以将行返回到视图),我们将不胜感激

一些示例代码:

目前,我的PrimaryDomain代码首先是这样设置的(这没有指定最小/最大长度等的装饰器):

我有一个不同于ASP.NET WebSecurity提供的用户类,它看起来是这样的:(另外,我知道“密码”不应该是字符串格式,这只是为了初始设置的目的——我认为密码可能应该被完全删除并由WebSecurity处理)

在为视图提取数据时,我使用直接注入在存储库中运行所有内容:

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