我将 EF 和 AutoMapper 与 Azure 表存储仿真一起使用。
我有两种类型,Fragment(可序列化 DTO)和 FragmentEntity(EF 持久化 DO)。我使用 AutoMapper 从 DTO 映射到 DO,以便在 PUT 调用上保持持久性,在 GET 调用上反之亦然。
问题是我对 EF 和 AutoMapper 都缺乏经验。我已将 FragmentEntity 类(根据我能找到的文档)配置为在数据库中为 Fragment 生成 Id(见下文)。
实体 ID 定义:
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int? Id { get; set; }
在运行时,http 客户端使用新内容(片段)进行 REST PUT 调用。这通过 WCF 接收并序列化为 Fragment,如下所示。
[OperationContract]
[WebInvoke(UriTemplate = "/Fragments", Method = "PUT")]
void PutFagment(Fragment fragment);
在调试期间,如果我跳过代码,接收到的 ID 值为 null(因为我已将 ID 属性定义为可选)。
public void PutFagment(Fragment fragment)
{
var fragmentEntity = Mapper.Map<Fragment, FragmentEntity>(fragment);
_fragmentContext.Add(fragmentEntity);
}
[DataMember]
public virtual int? Id { get; set; }
我不确定将其定义为可选是否是明智之举;我这样做是因为如果它不是可选的,则该值默认为零,然后自动映射器映射到目标 FragmentEntity,随后数据库中的所有键最终都为零(显然是错误的)。
正如您可能期望的那样,我还使 FragmentEntity Id 成为可选以避免在应用程序代码中设置值,我希望如果它为空,则可能会发生数据库生成,但这似乎没有发生。
<Fragment><Id i:nil="true"/><Name>Drei</Name><Type>3</Type></Fragment>
我的问题:
- 我认为在两个类中使 Id 可选的决定是不正确的,我假设有一些 AutoMapper 配置可以适当地处理这种情况,并且两者都可以保持非可选。
- 我不确定为什么 DatabaseGenerated 属性没有生效。