使用 Entity Framework 创建自定义模型,该模型不是数据库中任何 table 的模型

Using Entity Framework to create a custom model that is not a model of any table in a database

我是第一次使用 .NetCore Entity Framework,想知道是否可以生成自定义模型。

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

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

我所有的其他控制器return一个这样的模型:

return View(characterList);

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

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

谢谢!

您首先可以简单地创建您想要在代码中拥有的模型。 例如:

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()

这样你就得到了新模型的列表。你可以例如包括其他表并将它们连接到查询中以使其更复杂。但是这个例子应该给你一个起点。

如果您正在解释的模型应该仅用于视图,请考虑创建一个 ViewModel,它基本上是一个 class,仅包含视图所需的属性,通常没有任何逻辑或仅包含在视图中显示立即需要的逻辑。

例如,您将创建一个新的 class,假设 CharacterVM

public class CharacterVM
{
    public string Name{ get; set; }

    public string CharacterType {get; set; }

    public bool Invincible{ get; set; }
}

在您看来,您将使用 CharacterVM,它具有 CharacterVM 中公开的所有属性 class

@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);
}