EF6中能否将时态表影子属性值映射到实体非映射列?
在Entity Framework 6中读取时态表PeriodStart/PeriodEnd到实体非映射列的方案
EF6没有EF Core那样原生支持影子属性映射到实体非映射列的机制,你试的EF Core方案自然不生效。这里给你几个适配EF6的可行方案:
方案1:查询投影直接赋值
写查询时手动把数据库的时态列投影到实体的非映射属性上,实体上的对应属性要加[NotMapped]标记,避免EF6试图映射到表列:
var entities = dbContext.YourEntities .Select(e => new YourEntity { Id = e.Id, Name = e.Name, // 其他已映射的实体属性 PeriodStart = e.PeriodStart, PeriodEnd = e.PeriodEnd }) .ToList();
方案2:拦截ObjectMaterialized事件全局赋值
利用EF6的ObjectContext的ObjectMaterialized事件,在实体从数据库加载完成后,从实体的原始值集合里取时态列的值,赋值给非映射属性,不用逐个修改查询:
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; objectContext.ObjectMaterialized += (sender, args) => { var targetEntity = args.Entity as YourEntity; if (targetEntity == null) return; var stateEntry = objectContext.ObjectStateManager.GetObjectStateEntry(targetEntity); // 注意这里的列名要和数据库时态列的名称完全一致 var startValue = stateEntry.OriginalValues["PeriodStart"]; var endValue = stateEntry.OriginalValues["PeriodEnd"]; if (startValue != DBNull.Value) targetEntity.PeriodStart = (DateTime)startValue; if (endValue != DBNull.Value) targetEntity.PeriodEnd = (DateTime)endValue; };
方案3:SQL查询结合自定义构造函数
如果习惯用原生SQL查询,可以直接返回时态列,通过实体的自定义构造函数完成赋值:
// 实体类定义 public class YourEntity { public int Id { get; set; } public string Name { get; set; } // 已映射属性 [NotMapped] public DateTime PeriodStart { get; set; } [NotMapped] public DateTime PeriodEnd { get; set; } // 用于SQL查询投影的构造函数 public YourEntity(int id, string name, DateTime periodStart, DateTime periodEnd) { Id = id; Name = name; PeriodStart = periodStart; PeriodEnd = periodEnd; } } // 执行SQL查询 var entities = dbContext.Database.SqlQuery<YourEntity>( "SELECT Id, Name, PeriodStart, PeriodEnd FROM YourTable") .ToList();
内容的提问来源于stack exchange,提问作者witkacy1986
相关产品推荐
相关产品推荐

