猿问

Codefirst中使用NotMapped

最近在学习使用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字段的一张表的。只是在将表转化成对象的时候忽略掉了这个字段。我却因为这个要去新建一个“无意义”的实体。觉得有些别扭,网上没找到想要的答案。所以在这里求大佬赐教。


aluckdog
浏览 1064回答 1
1回答

陪伴而非守候

1. 你可以不必建这个属性的。2. 如果你非要有这个属性, NotMapped 的属性,你又非要从数据库查询中取,当然是这个鬼样了。人家提供了让你可以有属性不映射到数据库,没说让你从数据库取值的,比如像你这样的,完全可以在构造函数中直接给 fieldC赋值的。&nbsp;
随时随地看视频慕课网APP
我要回答