我想为我的应用程序提供一个OData接口。我看到的例子使用EF将LINQ查询映射到SQL查询。
恕我直言,这种方法将物理数据库模型暴露给了世界(我知道EF/NH提供了一些灵活性,但它是有限的)。
我希望我能做的是:
- 通过dto定义我的数据合同。
- 有一个OData Service,可以让用户查询我的数据合同Dtos。
- 有一些翻译层将dto上的查询转换为EF模型或NH上的查询。
- 执行翻译后的查询
- 将结果映射回我的数据合同。
我有两个模型,"合同"模型和"持久"模型。持久化模型是实体框架映射到的对象。Get方法返回一个IQueryable返回一个IQueryable也就是这样的东西
return dbContext.PersistedCustomers.Select(x => new Customer(Name = x.OtherName, ...));
至少在使用DbContext而不是ObjectContext时,基于契约模型的Where标准被自动转换为要对数据库执行的PersistedModel的Where标准。希望两者之间的差异没有复杂到需要一些奇怪的数据处理的程度。我相信它的逆转作用是有限的。
一种方法是创建一个表示模型的ViewModel,然后使用AutoMapper在它们之间进行映射。你可以这样使用:
var address = _Context.Addresses.Where(p => p.AddressID == addressID).Single();
AddressVM result = Mapper.Map<AddressVM>(address);