Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将其保存在实体中_C#_Entity Framework_Crud - Fatal编程技术网

C# 如何将其保存在实体中

C# 如何将其保存在实体中,c#,entity-framework,crud,C#,Entity Framework,Crud,假设我有一个大实体,并希望创建一个典型的CRUD应用程序。用户不应该有能力保存我的实体的某些字段 因此,我看到了两种实现更改保存逻辑的方法: (a) 从数据库获取实体 输出到包含所有字段的页面(用户不应更改为隐藏输入的字段) 以邮寄方式取得实体 附加到上下文并保存 在这种情况下,我需要在页面上显示无用的字段。毫无疑问,这很糟糕 (b) 从数据库获取实体 仅显示必要字段(用户可以更改的字段) 以邮寄方式取得实体 从数据库获取实体 用新值填充数据库实体并保存 在这种情况下,我需要对数据库进行额外的查

假设我有一个大实体,并希望创建一个典型的CRUD应用程序。用户不应该有能力保存我的实体的某些字段

因此,我看到了两种实现更改保存逻辑的方法:

(a)

  • 从数据库获取实体

  • 输出到包含所有字段的页面(用户不应更改为隐藏输入的字段)

  • 以邮寄方式取得实体

  • 附加到上下文并保存

  • 在这种情况下,我需要在页面上显示无用的字段。毫无疑问,这很糟糕

    (b)

  • 从数据库获取实体

  • 仅显示必要字段(用户可以更改的字段)

  • 以邮寄方式取得实体

  • 从数据库获取实体

  • 用新值填充数据库实体并保存

  • 在这种情况下,我需要对数据库进行额外的查询。所以这对性能不好


    什么是正确的方法?

    建议对不同的任务使用不同的
    视图模型。如果要向用户显示要编辑的
    Model
    的某些字段,则可以使用
    EditModel
    并在保存时使用
    CreateModel
    创建和填充数据库。这样可以避免用户知道数据库结构,从而确保保护和安全。

    或C):

  • 从数据库获取实体
  • 仅使用允许的字段将实体映射到ViewModel
  • 将带有数据的ViewModel发布回控制器
  • 将ViewModel映射回实体
  • 附加并保存
  • 编辑:
    我强烈推荐来回映射

    有趣的是,我刚刚观看了朱莉·勒曼(Julie Lerman)制作的视频,她在视频中讨论了几乎完全相同的问题。你的两个解决方案都不是她想要的:

    有一个单独的实体类,其中包含要在屏幕上显示的字段,但仍然映射到与常规实体类相同的表。然后只需查询该数据库集以获取实体(仅包含这些字段),并将更新保存到该数据库集


    她在讨论在实体框架之上实现领域驱动设计时提到了这一点。因此,如果应用程序中的不同函数具有不同的DbContext,则仍可以使用写入表的DbContext,但可以限制该上下文可以写入的字段。

    “将ViewModel映射回实体”如何操作?在哪里可以得到实体?您的实体是最终返回数据库的实体,换句话说,它是代码优先模型或实体框架模型中的类