entity-framework – 使用OData v4,EF6和Web API v2.2处理日期

前端之家收集整理的这篇文章主要介绍了entity-framework – 使用OData v4,EF6和Web API v2.2处理日期前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在从v1-3升级到v4,但我遇到了一些问题.

我的理解是DateTime不受支持,我必须始终使用DateTimeOffset.精细.

但在我在DateTime中存储sql日期数据类型之前,现在看来我得到了这个错误

  1. Member Mapping specified is not valid. The type 'Edm.DateTimeOffset[Nullable=False,DefaultValue=,Precision=]' of member 'CreatedDate' in type 'MyEntity' is not compatible with 'sqlServer.date[Nullable=False,Precision=0]'

为此做了什么工作?我需要能够专门存储数据库中的日期(时间和地点并不重要).如果我能得到Edm.Date以及返回的数据类型会很棒,但我之前没有.

谢谢.

编辑:示例类

之前:

  1. public class Ticket
  2. {
  3. [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  4. public int Id { get; set; }
  5.  
  6. [required,MaxLength(50)]
  7. public string Reference { get; set; }
  8.  
  9. [Column(TypeName = "date")]
  10. public DateTime LoggedDate { get; set; }
  11. }

后:

  1. public class Ticket
  2. {
  3. [Key,MaxLength(50)]
  4. public string Reference { get; set; }
  5.  
  6. [Column(TypeName = "date")]
  7. public DateTimeOffset LoggedDate { get; set; }
  8. }

这在EF中无效.

解决方法

一种选择是在实体中定义新属性.说标题映射到EF:
  1. public partial class Title
  2. {
  3. public int Id { get; set; }
  4. public string Name { get; set; }
  5. public Nullable<System.DateTime> CreatedOn { get; set; }
  6. }

然后添加DateTimeOffset的新属性

  1. public partial class Title
  2. {
  3. [NotMapped]
  4. public DateTimeOffset? EdmCreatedOn
  5. {
  6. // Assume the CreateOn property stores UTC time.
  7. get
  8. {
  9. return CreatedOn.HasValue ? new DateTimeOffset(CreatedOn.Value,TimeSpan.FromHours(0)) : (DateTimeOffset?)null;
  10. }
  11. set
  12. {
  13. CreatedOn = value.HasValue ? value.Value.UtcDateTime : (DateTime?)null;
  14. }
  15. }
  16. }

并且生成OData模型的代码如下所示:

  1. public static IEdmModel GetModel()
  2. {
  3. ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
  4. EntityTypeConfiguration<Title> titleType= builder.EntityType<Title>();
  5. titleType.Ignore(t => t.CreatedOn);
  6. titleType.Property(t => t.EdmCreatedOn).Name = "CreatedOn";
  7.  
  8. builder.EntitySet<Title>("Titles");
  9.  
  10. builder.Namespace = typeof(Title).Namespace;
  11.  
  12. return builder.GetEdmModel();
  13. }
  14. }

控制器看起来像:

  1. public class TitlesController : ODataController
  2. {
  3. CustomerManagementSystemEntities entities = new CustomerManagementSystemEntities();
  4.  
  5. [EnableQuery(PageSize = 10,MaxExpansionDepth = 5)]
  6. public IHttpActionResult Get()
  7. {
  8. IQueryable<Title> titles = entities.Titles;
  9. return Ok(titles);
  10. }
  11.  
  12. public IHttpActionResult Post(Title title)
  13. {
  14. entities.Titles.Add(title);
  15. return Created(title);
  16. }
  17. }

猜你在找的HTML相关文章