最近在学习使用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字段的一张表的。只是在将表转化成对象的时候忽略掉了这个字段。我却因为这个要去新建一个“无意义”的实体。觉得有些别扭,网上没找到想要的答案。所以在这里求大佬赐教。
1 回答
陪伴而非守候
TA贡献1757条经验 获得超8个赞
1. 你可以不必建这个属性的。
2. 如果你非要有这个属性, NotMapped 的属性,你又非要从数据库查询中取,当然是这个鬼样了。
人家提供了让你可以有属性不映射到数据库,没说让你从数据库取值的,
比如像你这样的,完全可以在构造函数中直接给 fieldC赋值的。
- 1 回答
- 0 关注
- 1063 浏览
添加回答
举报
0/150
提交
取消