我有一个问题,我无法找到解决方案,我想知道是否有人可以给出一些建议。
我有一个模拟的datacontext / objectset,通过接口和t4模板完成,带有一些ninject魔法,目的是在内存数据集中进行单元测试。
但是,您应该如何处理外键值/导航属性?
假设我有酒店和客户,ctx.Hotels有一些价值,但Customer.Hotels没有。如果它是一对一的关系,那么get就是这样的:
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Hotel>("HotelModel.FK_Customers_Hotels", "Hotel").Value;
和一对多:
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<BookingRow>("HotelModel.FK_BookingRows_Customers", "BookingRow");
我的技能水平还不足以理解这里发生的事情。
[编辑:] 大师朱莉·勒曼证实这是一个死胡同。你不能正确地模拟实体对象,你需要POCO。
答案 0 :(得分:3)
当您使用基于ObjectContext
的实体时,模拟EntityObject
几乎是不可能的,因为例如RelationshipManager
是一个真正的类,无法用您的模拟替换。此外,您的实体严重依赖于不可模拟的EF代码。
注意:“主要”因为你可以模拟它,但你需要特殊的框架来拦截对真实对象的调用并将它们转发给你的方法。只有使用TypeMock Isolator或MS Moles才能实现这一点。
顺便说一下。模拟EF代码是你不想做的事情 - 浏览this answer和链接的答案。其中一些针对较新的EF API,但问题仍然存在。