我第一次使用.NetCore实体框架,想知道是否有可能生成自定义模型。
设置应用程序时,EF从数据库中创建了所有模型。很好,这是预期的。
但是,我现在创建了一个新的控制器,该控制器返回的数据是复杂的linq查询的结果。
我所有其他控制器都返回如下模型:
return View(characterList);
其中characterList是数据库表的实际模型。
但是我将如何创建一个不代表数据库中任何表的全新自定义模型?
谢谢!
答案 0 :(得分:3)
您首先可以简单地创建想要在代码中包含的模型。 例如:
Public class NewModel {
Public String Test {get; set;}
}
然后,您可以使用上下文和linq / select的功能来查询新模型。 像这样:
List<NewModel> list = dbContext.Set<OldModel>().Where(...).Select<NewModel>(x=> new NewModel(){ Test = x.OldTestString }).ToList()
因此您将获得新模型的列表。您可以例如包括其他表并将它们加入查询中使其变得更加复杂。但是这个例子应该给你一个起点。
答案 1 :(得分:2)
如果假设您要解释的模型仅用于视图,请考虑创建一个ViewModel,该类基本上是一个仅包含视图所需属性的类,通常不包含任何逻辑,或者仅包含立即在其中显示的逻辑一个视图。
例如,您将创建一个新类,例如CharacterVM
public class CharacterVM
{
public string Name{ get; set; }
public string CharacterType {get; set; }
public bool Invincible{ get; set; }
}
在您看来,您将使用CharacterVM,它具有CharacterVM类中公开的所有属性
@model CharacterVM
最重要的步骤是从数据库模型重新映射属性(假设它称为Character
),在这种情况下,您要做的就是将Character
的属性重新映射到您将传递给视图的CharacterVM
新实例的属性。
public IActionResult Index(int idCharacter)
{
var character = db.Characters.SingleOrDefault(c => c.idCharacter == idCharacter);
var characterVM = new CharacterVM()
{
Name = character.Name,
CharacterType = character.Type.Name,
Invincibility = false
};
return View(characterVM);
}