首页 > 解决方案 > 将 FieldName 和 TableName 的行值转换为 ClassName 及其属性并使用 Entity Framework 保存到 DB

问题描述

我有一个表Sync_Transaction,其中有一列FieldName存储另一个表的列名,DDR_Transaction并且NewValues是我要插入/更新的值。

现在我想从 TableName 构建 className 并从 FieldName 构建该类的属性,并使用 Entity Framework 插入到表中。

Sync_Transaction

RecordId    DMLType TableName   PKId    FieldName   OldValue    NewValue
1   I   DDR_Transaction 1   DDRId   NULL    1
2   I   DDR_Transaction 1   VesselID    NULL    31
3   I   DDR_Transaction 1   TransactionID   NULL    0
4   I   DDR_Transaction 1   GeneratedDate   NULL    Aug  1 2019 12:07PM
5   I   DDR_Transaction 1   MasterName  NULL    Master Name
6   I   DDR_Transaction 1   ChiefEngineerName   NULL    Chief Engineer Name
7   I   DDR_Transaction 1   Title   NULL    FIRST DDR
8   I   DDR_Transaction 1   ComponentNo NULL    13463
9   I   DDR_Transaction 1   TypeOfDefect    NULL    NON-ESSENTIAL
10  I   DDR_Transaction 1   Severity    NULL    1
11  I   DDR_Transaction 1   VIQChapterId    NULL    1
12  I   DDR_Transaction 1   VIQRefId    NULL    1
13  I   DDR_Transaction 1   Responsibility  NULL    6
14  I   DDR_Transaction 1   IdentifiedDate  NULL    Jul 28 2019 12:00AM
15  I   DDR_Transaction 1   RepairedBy  NULL    1
16  I   DDR_Transaction 1   PlannedFor  NULL    4
17  I   DDR_Transaction 1   Priority    NULL    9
18  I   DDR_Transaction 1   DueDate NULL    Aug 10 2019 12:00AM
19  I   DDR_Transaction 1   EstStartDate    NULL    Aug  3 2019 12:00AM
20  I   DDR_Transaction 1   EstCompletionDate   NULL    Aug  5 2019 12:00AM
21  I   DDR_Transaction 1   IsSMSRequired   NULL    0
22  I   DDR_Transaction 1   IsRARequired    NULL    0
23  I   DDR_Transaction 1   IsMOCRequired   NULL    0
24  I   DDR_Transaction 1   IsPTWRequired   NULL    0
25  I   DDR_Transaction 1   IsReliability   NULL    0
26  I   DDR_Transaction 1   DescOfDefectDamage  NULL    TEST FIRST
27  I   DDR_Transaction 1   CauseOfDamage   NULL    TEST FIRST CAUSE
28  I   DDR_Transaction 1   IsJobCardAmended    NULL    0
29  I   DDR_Transaction 1   IsAdditionalJobs    NULL    0
30  I   DDR_Transaction 1   ISDraft NULL    0
31  I   DDR_Transaction 1   CreatedBy   NULL    17
32  I   DDR_Transaction 1   CreatedDate NULL    Aug  1 2019 12:07PM
33  I   DDR_Transaction 1   IsDeleted   NULL    0
34  U   DDR_Transaction 1   GeneratedDate   Aug  1 2019 12:07PM Aug  1 2019 12:07PM
35  U   DDR_Transaction 1   ComponentNo 13463   13409
36  U   DDR_Transaction 1   DescOfRepairPlanned NULL    repiared
37  U   DDR_Transaction 1   IsJobCardAmended    0   1
38  U   DDR_Transaction 1   IsAdditionalJobs    0   1
39  U   DDR_Transaction 1   RepairDate  NULL    Aug 14 2019 12:00AM
40  U   DDR_Transaction 1   CreatedDate Aug  1 2019 12:07PM Aug  1 2019 12:07PM
41  U   DDR_Transaction 1   ModifiedBy  NULL    17
42  U   DDR_Transaction 1   ModifiedDate    NULL    Aug  1 2019 12:09PM


DDR_事务

DDRId   int
VesselID    int
TransactionID   int
DDRNo   varchar
GeneratedDate   datetime
MasterName  nvarchar
ChiefEngineerName   nvarchar
Title   nvarchar
ComponentNo int
TypeOfDefect    nvarchar
Severity    int
VIQChapterId    int
VIQRefId    int
Responsibility  int
IdentifiedDate  datetime
RepairedBy  nvarchar
PlannedFor  nvarchar
Priority    nvarchar
DueDate datetime
EstStartDate    datetime
EstCompletionDate   datetime
IsSMSRequired   bit
IsRARequired    bit
IsMOCRequired   bit
IsPTWRequired   bit
SMSTransID  int
RATransID   int
MOCTransID  int
PTWTransID  int
DockPlanJobNo   int
IsReliability   bit
ReliabilityType int
OffHireTimeInMinutes    int
OffHireTimeInHours  decimal
Comments    nvarchar
DescOfDefectDamage  nvarchar
CauseOfDamage   nvarchar
DescOfRepairPlanned nvarchar
IsJobCardAmended    bit
PMSChangeRequestTransID int
IsAdditionalJobs    bit
RepairDate  datetime
ISDraft bit
CreatedBy   int
CreatedDate datetime
ModifiedBy  int
ModifiedDate    datetime
IsDeleted   bit
DeletedBy   int
DeletedDate datetime


标签: c#.netentity-frameworkasp.net-core

解决方案


不幸的是,您不能创建一个类并在运行时使用它来映射模型,原因有两个:

  1. 如果您直接映射,则必须在 a 中设置实体;如果您要显式映射实体,则DbSet必须实现IEntityTypeConfiguration
  2. 考虑DesignTimeDbContextFactory为您的应用程序运行运行您的映射和检查您的连接和迁移等,因此它完全不可能执行您在实体框架中提到的操作。

我建议您在参考表上使用 a ,每次更新数据时trigger排序,您运行一个存储过程,从中读取值并根据需要修改目标表结构。

您也可以使用实体框架从代码中调用该存储过程。

希望能帮助到你,


推荐阅读