首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >需要帮助理解实体框架

需要帮助理解实体框架
EN

Stack Overflow用户
提问于 2021-09-22 20:15:15
回答 1查看 56关注 0票数 0

我的前任为人力资源部编写了一个web应用程序,从我们的人力资源管理系统中提取有关401 K贡献的数据。结果发现,他的报告只在捐款是一个确切的美元数额而不是一个百分比的情况下,才能弥补捐款的不足。他用实体框架来做这件事。我是个抄写员,不是程序员。我了解ADO。我不知道实体框架。

数据库有一个名为EARNED的列。追赶贡献金额,得到代码D03。追赶贡献百分比得到代码D03B。本专栏还有其他几个可能的值: D04、D31、E40等等。不知怎么的,他的报告只提取了D03行。它还需要提取D03B行。

如果我写的是SQL,那就像

代码语言:javascript
代码运行次数:0
运行
复制
SELECT * 
FROM [SageHRMS_900].[dbo].[UPCHKD] 
WHERE [EARNDED] = 'D03B' 
   OR [EARNDED] = 'D03'

显然实体框架不使用类似的东西。相反,我看到的只是这样的东西

代码语言:javascript
代码运行次数:0
运行
复制
hrmsEntity hrms = new hrmsEntity(dbConnection);
var detail = hrms.TRP_ConDetail.ToList();

foreach (var line in hrms.TRP_ConDetail.ToList())
{
    fileData += line.Plan + line.RecordID + line.Date + line.SSN + line.Fund + line.LoanNum +
    line.Amount + line.Salary + line.SalaryType + line.ContType + line.StateTax + 
    line.LoanPayType + line.Filler01 + Environment.NewLine;
}

我知道在哪里定义了TRP_Con类

代码语言:javascript
代码运行次数:0
运行
复制
public class TRP_ConDetail
{
    [Key]
    public Guid ID { get; set; }
    public string Plan { get; set; }
    public string RecordID { get; set; }
    public string Date { get; set; }
    public string Name { get; set; }
    public string SSN { get; set; }
    public string Fund { get; set; }
    public string Desc { get; set; }
    public string LoanNum { get; set; }
    public string Amount { get; set; }
    public decimal Dollars { get; set; }
    public string Salary { get; set; }
    public string SalaryType { get; set; }
    public string ContType { get; set; }
    public string StateTax { get; set; }
    public string LoanPayType { get; set; }
    public string Filler01 { get; set; }
    public int? LineSq { get; set; }
}

我不明白的是,代码如何知道如何将选择限制在D03类型的贡献上。

编辑:添加hrmsEntity类

代码语言:javascript
代码运行次数:0
运行
复制
public partial class hrmsEntity : DbContext
{
    //public hrmsEntity()
    //    : base("name=hrmsEntityModelDSM")
    //{
    //}
    /*Base entity connection depends on the entity of the company*/
    public hrmsEntity(string dbConnection) : base($"name={dbConnection}") { }

    //public hrmsEntity(string connectionString) : base(connectionString) { }

    public virtual DbSet<TRP_ConSourceTotal> TRP_ConSourceTotal { get; set; }
    public virtual DbSet<TRP_ConDetail> TRP_ConDetail { get; set; }
    public virtual DbSet<TRP_MaintFile> TRP_MaintFile { get; set; }
}

UPCHKD是900数据库中的一个表。

@Dai评论:“也请(为了每个人的理智)使用IDE的重构重命名功能将hrmsEntity重命名为HrmsDbContext”是的.我不是程序员。)我编写VBA或PowerShell脚本。调整C#几乎是我能力的极限。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-22 21:04:09

第一步是查看TRP_ConDetail映射到何处/映射到什么位置,因为该名称中的任何内容都与UPCHKD表无关。由于除了[Key]之外,实体类中没有其他属性,所以要检查的两个位置将位于DbContext本身(hrmsEntity)中,用于OnModelCreating()方法,或者在EntityTypeConfiguration<TRP_ConDetail>类型的解决方案中寻找一个类,该类指示将该实体映射到数据库中的哪个表或视图。这还会显示指向已为类重命名的“已挣”列的任何属性。

如果您提到他的代码只是在拉"D03“值,我的预感是TRP_ConDetail是一个视图,因为在您粘贴的代码中没有过滤代码逻辑。该代码将实体映射到表或视图,并输出整个集合。数据库中可能有一个名为TRP_ConDetail的视图,在该视图中可以找到类似于WHERE UPCHKD.EARNED = 'D03'的内容,您可以将其扩展为包含"D03B“值。

但是,请记住,如果系统是这样实现的,那么这将是一个警告,这将是一个非常糟糕的设计,就好像您进行了更改一样--它将影响引用此TRP_ConDetail DbSet的任何地方。任何其他只期望使用D03的代码现在都将同时接收D03和D03B,因此这很可能会在系统的其他领域引入bug。应该避免底层视图中的筛选规则,除非它是非常核心的、全局应用的规则,正是出于这个原因。通常,您希望看到的是在Linq表达式中完成的过滤:

例如,如果视图简单地将该UPCHKD和一些相关数据组合在一起,比如“挣来的”字段是视图的一部分,那么代码中该区域的Linq查询看起来更像是:

代码语言:javascript
代码运行次数:0
运行
复制
var detail = hrms.TRP_ConDetail
    .Where(x => x.Earned == "D03")
    .ToList();

本可以安全和容易地更新到:

代码语言:javascript
代码运行次数:0
运行
复制
var detail = hrms.TRP_ConDetail
    .Where(x => x.Earned == "D03" || x.Earned == "D03B")
    .ToList();

不幸的是,它看起来并不是以这种方式实现的,因此很有兴趣看看为什么不这样做,以及EF是否真的被用来代替ADO.Net。

您应该与雇主谈谈如何让熟悉实体框架的开发人员仔细检查实现,以确认视图是否被使用,并通过可能更新基础视图或“修复”视图来识别任何风险,以便选择标准由EF而不是视图定义完成。(在任何引用视图的地方都会有流的效果来检查、修改和测试)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69290743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档