c# - 将 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
解决方案
不幸的是,您不能创建一个类并在运行时使用它来映射模型,原因有两个:
- 如果您直接映射,则必须在 a 中设置实体;如果您要显式映射实体,则
DbSet
必须实现IEntityTypeConfiguration
- 考虑
DesignTimeDbContextFactory
为您的应用程序运行运行您的映射和检查您的连接和迁移等,因此它完全不可能执行您在实体框架中提到的操作。
我建议您在参考表上使用 a ,每次更新数据时trigger
排序,您运行一个存储过程,从中读取值并根据需要修改目标表结构。
您也可以使用实体框架从代码中调用该存储过程。
希望能帮助到你,
推荐阅读
- unit-testing - AutoFixture 生成一个 JsonDocument?
- javascript - 检测何时停止拖动块
- php - 在 WooCommerce 中显示基于自定义表的自定义字段值
- powerapps - 如果具有多个条件的函数没有返回正确的值
- python - 数据框有一个值列和唯一 ID 的列表,没有
- r - 在我的 R 包中提供 S4 方法
- android - Android中的自动滚动文本视图
- android - 将 BuildConfig.FLAVOR 与 android 数据绑定一起使用
- r - 如何在 R ggplot 循环中显示具有 2 种视觉效果的标题
- c# - ReferenceEquals 的快速 Equals 用于深度不可变的 C# 9 记录?