Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Entity framework 如何在实体框架中使用实体原始SQL查询中的数据_Entity Framework_Asp.net Core - Fatal编程技术网

Entity framework 如何在实体框架中使用实体原始SQL查询中的数据

Entity framework 如何在实体框架中使用实体原始SQL查询中的数据,entity-framework,asp.net-core,Entity Framework,Asp.net Core,我将首先说明我对asp.net核心和实体框架还是非常陌生,但我熟悉ADO和记录集,它似乎是实体框架的基础。我正在努力使用实体框架,因为我能够运行查询,但我不确定如何使用结果,我在网上看到的大多数帮助文档只讨论过程和方法,而不讨论如何使用结果。我正在我的站点上构建登录功能,并开发了以下代码来查询我的UserAccount表中的DB。对于这个登录,我真的只想要用户名、密码和ID,但是我在这个表中有多个字段,这方面我不需要。我是从使用ADO和记录集开始的,所以实际上我更喜欢使用原始sql并确定我想要对

我将首先说明我对asp.net核心和实体框架还是非常陌生,但我熟悉ADO和记录集,它似乎是实体框架的基础。我正在努力使用实体框架,因为我能够运行查询,但我不确定如何使用结果,我在网上看到的大多数帮助文档只讨论过程和方法,而不讨论如何使用结果。我正在我的站点上构建登录功能,并开发了以下代码来查询我的UserAccount表中的DB。对于这个登录,我真的只想要用户名、密码和ID,但是我在这个表中有多个字段,这方面我不需要。我是从使用ADO和记录集开始的,所以实际上我更喜欢使用原始sql并确定我想要对这些结果做什么,而不是将它们绑定到一些对象上,而实体框架似乎在很大程度上就是这样做的。我确实很喜欢实体框架的易用性和参数的使用,所以我更喜欢走这条路(不确定这是不是一个坏习惯)。除了我添加到列表时,它开始显示错误“InvalidOperationException:required列'AccessLevel'在'FromSql'操作的结果中不存在”我甚至没有尝试在查询中使用该字段,所以不确定为什么会出现该字段,我使用的是rawsql查询方法,那么为什么它试图查看该表的模型中的内容?最后,这应该返回一条记录,在这种情况下,我想从该记录字段中提取密码值,类似于我在ADO中使用的方式,正如您将在我的passwordhash验证中看到的那样,但我甚至不知道如何从查询结果中提取密码值。谢谢你在这方面的任何帮助,因为我在学习这些东西时感到头疼

               var UserResults = _context.UserAccounts.FromSqlInterpolated($"SELECT USERACCOUNT.USERNAME, USERACCOUNT.PASSWORD, USERACCOUNT.ID,USERACCOUNT.ACCESS_LEVEL FROM DBO.USERACCOUNT WHERE USERACCOUNT.USERNAME={UserName}");

            if (UserResults.Count() == 1) //if we have more than 1 result we have security issue so do not allow login
            {
                var passwordHasher = new PasswordHasher<string>();
                var hashedPassword = passwordHasher.HashPassword(null, Password);

                var testResults = UserResults.ToList();

                if (passwordHasher.VerifyHashedPassword(null, hashedPassword, THIS SHOULD BE VALUE FROM DB RIGHT HERE!!!) == PasswordVerificationResult.Success)
                {
                    var claims = new List<Claim>
                {
                    new Claim(ClaimTypes.Name, UserName)
                };
var UserResults=_context.UserAccounts.FromSqlInterpolated($“选择USERACCOUNT.USERNAME、USERACCOUNT.PASSWORD、USERACCOUNT.ID、USERACCOUNT.ACCESS_LEVEL FROM DBO.USERACCOUNT WHERE USERACCOUNT.USERNAME={USERNAME}”);
if(UserResults.Count()==1)//如果我们有多个结果,我们就有安全问题,所以不允许登录
{
var passwordHasher=new passwordHasher();
var hashedPassword=passwordHasher.HashPassword(null,Password);
var testResults=UserResults.ToList();
if(passwordHasher.VerifyHashedPassword(null,hashedPassword,这应该是这里DB的值!!!)==PasswordVerificationResult.Success)
{
var索赔=新列表
{
新索赔(ClaimTypes.Name、用户名)
};
我的背景如下:

public partial class LoginDBContext : DbContext
{
    public DbSet<UserAccount> UserAccounts { get; set; }

    public LoginDBContext(DbContextOptions<LoginDBContext> options) : base(options)
    {

    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<UserAccount>(entity =>
        {
            //entity.ToTable("UserAccount");
            entity.HasNoKey();

            //entity.Property(e => e.Id)
            //    .HasMaxLength(50)
            //    .IsUnicode(false);

            //entity.Property(e => e.Username)
            //    .HasMaxLength(50)
            //    .IsUnicode(false);
            //entity.Property(e => e.Password)
            //    .HasMaxLength(50)
            //    .IsUnicode(false);
        });
    }
}
public分部类LoginDBContext:DbContext
{
公共数据库集用户帐户{get;set;}
公共LoginDBContext(DbContextOptions选项):基本(选项)
{
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity(Entity=>
{
//实体。ToTable(“用户账户”);
entity.HasNoKey();
//entity.Property(e=>e.Id)
//.HasMaxLength(50)
//.IsUnicode(假);
//entity.Property(e=>e.Username)
//.HasMaxLength(50)
//.IsUnicode(假);
//entity.Property(e=>e.Password)
//.HasMaxLength(50)
//.IsUnicode(假);
});
}
}

如果不想加载用户表的所有列,可以返回具有所需属性的匿名对象,或者为所需列创建一个类并返回它

var users = _context.UserAccounts
    .Where(a => a.UserName == UserName)
    .Select(a => new { a.Id, a.UserName, a.Password })
    .ToArray();

if (users.Length == 1)
{
    var user = users.First();
    if (passwordHasher.VerifyHashedPassword(null, hashedPassword, user.Password) == PasswordVerificationResult.Success)
    {
        // ... your magic
    }
}

所以您甚至没有使用fromsqlinterpolated()?是否有一种方法可以使用原始sql(如我的代码)实现这一点?
FromRowSql
希望返回一个实体,因此它要求提供所有列。您说我正在努力使用实体框架,因为您没有按照它的设计使用它。仅为“异常”提供使用
FromRawSql
如果你不打算使用静态类型的查询,那么你的斗争将继续下去——寻找其他的ORM框架;)你完全正确,我可能应该强迫自己继续使用它来学习它。我将根据你所说的调整我的代码,但为了进一步理解为什么UserAccount会起作用,我需要调整我的DBF上下文吗我注释掉了ToTable(“UserAccount”),但我假设我应该使用它来创建链接,以便它知道表?另外,您通常会为每个表在同一个文件中创建一个DBContext(即,一个文件中每个表的modelBuilder.Entity).EF将默认使用实体类型名称作为表名,使用
ToTable('name')
当表名和类型名不同时。您可以在一个文件中的一个DbContext中配置多个表。啊,明白了。我想ModelBuilder对我来说真的不必要,因为它是完全相同的。只是好奇您对此的看法。如果我非常熟悉SQL,并且在VBA项目中经常使用ADO,您会这样做吗KI更适合于将ADO.NET用于应用程序与数据库通信,或者您认为强制从头开始学习实体框架可能更好吗?