到目前为止,在使用 WCF 时,我始终将整个 EF 生成的实体或 POCO(通过修改 T4 模板以在 POCO 和属性上包含 DataContract 和 DataMember)公开为 DataContract。
现在,我遇到了一种情况,我无法公开整个内容,并且需要显式指定我的 DataContract 作为实体的子集。
值得一提的是,我的实体之一如下所示:
![enter image description here](https://i.stack.imgur.com/uLiJw.png)
我只想公开 Id、Name、CategoryId、Price。
插入/更新其余字段(ActiveFrom
, InactiveDate
, Supported
) 是根据 BR 决定的,客户不知道也不应该知道有关它们的任何信息。
我尝试过以下方法,但每个方法似乎都有问题/不起作用:
Using 自动映射器:我需要将源对象映射到
目标对象,这是一个单向映射, 因此对于
我可以绘制演示目的Product
to ProductContract
。但对于添加/更新产品,它确实
不起作用,因为它不能做双向映射.
-
使用反射并为实体创建元数据类
添加[DataMember]
属性元数据类的属性如下
(请注意,我没有包含不需要的字段):
public class ProductMD : AssociatedMetadataTypeTypeDescriptionProvider
{
public ProductMD() :
base(typeof(Product))
{
}
[DataMember]
public int Id{ get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public int? CategoryID { get; set; }
[DataMember]
public decimal? Price { get; set; }
}
然后使用ProductMD
作为一个属性Product
部分类而不触及自动生成的实体(仅供参考:我有
更改了 POCO T4 模板生成器以包括[DataContract]
在每个实体上):
[MetadataType(typeof(ProductMD))]
public partial class Product
{
}
但在客户端,我没有
访问任何DataMembers
产品的。
现在我的问题是,获得我想要做的事情的最佳方法是什么(将实体的子集公开为DataContract
)?
我会选择选项 1 -> AutoMapper。
它不起作用,因为它无法进行双向映射。
您可以定义两种方式映射:
Mapper.CreateMap<Product, ProductContract>();
Mapper.CreateMap<ProductContract, Product>();
显然如果在你的ProductContract
进行映射时,您的属性少于域模型中的属性,因此只会填充相应的属性。
在进行逆映射更新时,您可以执行以下操作:
ProductContract pc = ...
Product productToUpdate = GetProduct(pc.Id);
Mapper.Map<ProductContract, Product>(pc, product);
// at this stage the product model will have the properties that
// were present in the ProductContract being mapped from them and
// the rest of the properties will stay unmodified, i.e. they will
// have their initial values that were retrieved from the database.
// Now we can update the product:
UpdateProduct(product);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)