请教几个EF的问题。
我通过EF进行关联查询,Code first模式。
实体建立好一直,如何关联查询呢?
目的就是为了翻译字典表
比如,我查询用户信息表SysUser,里面有一个状态属性State (int)
另外建立一个字典表SysUserStateDic 来存放状态,一共两列,ID、UserStateName
我在查询的时候输出,如何将SysUser里面的State翻译输出UserStateName列的内容?
百度了很多关系映射。
看的不是很明白,而且很多都是复制的同一个人的。
首先,在EF里要有外键关联
然后,在SysUser上用Include把SysUserStateDic加载进来既可以了。
var q= from c in dbcontext.sysuser join d in dbcontext.sysuserstatedic on c.state equals d.id select new { c.id, ... c.state, d.statename }
只能通过linq来查询吗?
6.0里面不能够自动映射出来吗?
@愤怒的TryCatch: 你使用的词汇让人更加迷糊。
不要用你所以为的专业词汇,就说你想怎样得到结果吧。举例说明也行。Don't make me think.
@爱编程的大叔:
对不起,大叔,我问题没有描述清楚。
这里起始就是一个联表查询的问题。我最终选择了用Include来联表。
多谢大叔的指正
对于你的这个问题,是有问题的,首先,你返回的类型你没有说,如果你要返回的是SysUser类型的话,那么UserStateName的值放在哪里返回给你 ,按你的问题我的理解是放在State里面,这个问题很严重的,因为这样就相当于State的值被修改了,那么你下次SaveChanges的时候,ef会把你的state值给你改到数据库里面,这不是你想要的吧,难道你在下次保存的时候,还要再把statename转成state??
正统的做法是做一个viewmodel,或者是结果model。比如:
1 public class Result 2 { 3 public Models.SysUser User { get; set; } 4 public string StateName { get; set; } 5 }
之所以不是在你的model里面加一个statename属性,是为了保证你的model数据库的一一对应关系尽量不被破坏。当你有了上面这个类(这个类不被映射到数据库,只是一个内存中使用的类),你的查询可以这样写:
1 using (Models.DbStock db = new Models.DbStock()) 2 { 3 var result = from u in db.SysUsers 4 join s in db.SysUserStateDics 5 on u.state equals s.ID 6 select new Result() { User = u, StateName = s.UserStateName }; 7 List<Result> listusers = result.ToList(); 8 }
listusers包含了每一个user以及它所对应的statename,当然,如果你不想用这个类,想用dictionary也是可以的,不过,还是建议使用一个新的类。