【问题标题】:Using Entity Framework to create a custom model that is not a model of any table in a database使用实体框架创建自定义模型,该模型不是数据库中任何表的模型
【发布时间】:2019-04-11 07:11:20
【问题描述】:

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

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

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

我所有的其他控制器都返回这样的模型:

return View(characterList);

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

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

谢谢!

【问题讨论】:

  • 在该行代码中,characterList 被用作与控制器操作匹配的视图的视图模型。您可以在那里使用的类真的没有什么特别之处。您可以创建一个全新的类来充当您的视图模型,其中包含正确显示页面所需的任何属性。
  • @BradleyUffner 谢谢!我所有的其他模型都有与之关联的视图。所以我可以创建一个具有所需属性的自定义类,然后为该类创建一个自定义视图?
  • 这是大体思路。@wegelagerer 给出的答案非常准确。
  • 您与 EF 一起使用的类是实体。有时您可能会将它们用作视图的“模型”,但两者并非不可分割。您可以拥有从未用作模型的实体类以及与您的数据库或 EF 无关的模型。

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


【解决方案1】:

您首先只需在代码中创建您想要的模型。 例如:

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

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

【讨论】:

    【解决方案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);
    }
    

    【讨论】:

    • 这个新的自定义模型将具有一组属性,其中一些确实存在于数据库表中(因此存在现有模型),而另一些则不存在于数据库中。现在我脑子里想着自定义模型,它将有 2 个来自 characterList 模型的属性,2 个来自 gameWorld 模型的属性,1 个来自 playerGroup 模型的属性,以及 6 个自定义属性。
    • @SkyeBoniwell 属性来自哪里并不重要;您可以随意将它们组合到 ViewModel 中。我添加了一个控制器示例。我希望它澄清了应该做什么才能实现你想要的。
    猜你喜欢
    • 2017-08-10
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多