【问题标题】:The required column was not present in the results of a 'FromSql' operation“FromSql”操作的结果中不存在所需的列
【发布时间】:2016-04-21 19:02:02
【问题描述】:

我刚刚开始使用 EF7 学习 MVC6。我有一个存储过程,我想返回模型中的一部分字段。如果我不返回模型中的每个字段,我会收到“‘FromSql’操作的结果中不存在所需的列‘FirstName’”。

有没有办法让一些列不需要,这样我就可以只返回模型中的一部分字段?

型号:

public class LoginViewModel
{
    [Key]
    public int UserID { get; set; }

    [Required]
    [Display(Name = "Username")]
    public string Username { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Protected ID")]
    public string ProtectedID { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }
}

我的测试过程:

CREATE PROCEDURE [dbo].[aaa_TopXXUsersTest]
@NumToReturn int = 10
AS
BEGIN
    SET NOCOUNT ON;
    select top(@NumToReturn) UserID, LastName, Username,Password, ProtectedID from Users where Deleted = 0

END

最后,我的控制器代码:

public IActionResult Index()
{
    var user = _context.Set<LoginViewModel>().FromSql("dbo.aaa_TopXXUsersTest @NumToReturn = {0}", 20);

    return View(user);
}

如果我在我的存储过程中包含我模型的所有字段,调用工作正常,但我似乎不能只返回一个子集。有没有办法让某些字段不需要?

【问题讨论】:

  • here 描述的方式可能对你有好处。它允许使用 EF7 而无需定义像 LoginViewModel 这样的类。您将获得带有存储过程返回的所有属性的 dynamic 对象(您可以将其转换为对象)。
  • 我希望这个简单的方法是可行的,但你的链接提供了我需要的东西。谢谢奥列格

标签: asp.net-core-mvc entity-framework-core


【解决方案1】:

使用[NotMapped] 属性和名字。

NotMappedattribute 可以应用于我们不想在数据库中为其创建相应列的实体类的属性。

public class LoginViewModel
    {
        [Key]
        public int UserID { get; set; }

        [Required]
        [Display(Name = "Username")]
        public string Username { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "Protected ID")]
        public string ProtectedID { get; set; }

        [NotMapped]
        public string FirstName { get; set; }

        public string LastName { get; set; }
    }

【讨论】:

  • 不要忘记包含使用 System.ComponentModel.DataAnnotations.Schema;我发现这个答案很有帮助,谢谢 Sanjay Katiyar !!!!!! :)
【解决方案2】:

这意味着结果集中没有返回“FirstName”列。 执行“SELECT * FROM TABLE”来解决问题。

【讨论】:

    【解决方案3】:

    它需要从 SP 返回一个 Id 列。

    select top(@NumToReturn) 0 AS 'Id', UserID, LastName, Username,Password, ProtectedID 
      from Users 
     where Deleted = 0
    

    或者从选择和模型中将UserID 更改为Id

    【讨论】:

      【解决方案4】:

      尝试删除这个公共字符串 FirstName { get;放; }。您的存储过程未返回 Firstname 字段的值,但您试图在此字符串 Firstname 变量中的 loginViewModel 类中接受它。

      【讨论】:

        猜你喜欢
        • 2019-07-20
        • 2020-07-02
        • 2019-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多