EF7でMVC6の学習を始めたところです。モデルにあるフィールドの一部を返すストアドプロシージャがあります。モデルのすべてのフィールドを返さない場合、「必要な列 'FirstName'が 'FromSql'操作の結果に存在しませんでした」と表示されます。
モデルのフィールドの一部のみを返すことができるように、一部の列を不要にする方法はありますか?
モデル:
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);
}
ストアドプロシージャにモデルのすべてのフィールドを含めると、呼び出しは正常に機能しますが、サブセットだけを返すようには見えません。一部のフィールドを不要にする方法はありますか?
中古 [NotMapped]
属性と名。
NotMapped
attributeは、データベースに対応する列を作成しないエンティティクラスのプロパティに適用できます。
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; }
}
これは、列 'FirstName'が結果セットで返されないことを意味します。この問題を解決するには、「SELECT * FROM TABLE」を実行してください。
SPからId列を返す必要があります。
select top(@NumToReturn) 0 AS 'Id', UserID, LastName, Username,Password, ProtectedID
from Users
where Deleted = 0
またはUserID
を選択とモデルからId
に変更します