使用实体框架创建自定义模型,该模型不是数据库中任何表的模型

时间:2018-11-07 19:32:11

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

我第一次使用.NetCore实体框架,想知道是否有可能生成自定义模型。

设置应用程序时,EF从数据库中创建了所有模型。很好,这是预期的。

但是,我现在创建了一个新的控制器,该控制器返回的数据是复杂的linq查询的结果。

我所有其他控制器都返回如下模型:

return View(characterList);

其中characterList是数据库表的实际模型。

但是我将如何创建一个不代表数据库中任何表的全新自定义模型?

谢谢!

2 个答案:

答案 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);
}