最近在学习使用ef框架,在使用过程中遇到一个问题,
由于使用Codefirst,数据库的创建是根据实体属性来的。有些属性不需要创建对应的表字段。ef中可以使用NotMapped来标识类的某个属性不需要创建对应的数据库字段。
但是此操作会导致在调用ef中执行sql脚本函数(context.database.sqlquery)的时候,被NotMapped描述属性不能被正常查出来。
例如:
class a 中有属性 fieldA,fieldB,fieldC。fieldC有NotMapped描述。
执行List<a> result = context.database.sqlquery<a>("select fieldA,fieldB,1 as filedC").tolist();
查询结果result中的fieldC的属性为null。
解决方案:
使用viewmodel的形式获取数据,然后将数据拷贝到a中。
class b:a{}
b不包含在ef上下文中。
List<a> result = context.database.sqlquery<b>("select fieldA,fieldB,1 as filedC").select(x=>new a(){
fieldA=x.fieldA,
fieldB=x.fieldB,
fieldC=x.fieldC
}).tolist();
这种方式可以解决问题,但是总觉得多绕了一步。监测数据库的时候看到ef发送的sql指令是完完整整发过去的。也就是说ef肯定是接收到了一张完整,包含fieldC字段的一张表的。只是在将表转化成对象的时候忽略掉了这个字段。我却因为这个要去新建一个“无意义”的实体。觉得有些别扭,网上没找到想要的答案。所以在这里求大佬赐教。
陪伴而非守候