实体框架在课堂上的检查日期

本文关键字:检查 日期 课堂 框架 实体 | 更新日期: 2023-09-27 18:18:53

我在一个ASP中使用实体框架。Net MVC项目。这个项目的目的是为一个用vb6编写的旧桌面项目创建一个web版本。这个vb6项目保存日期为11/11/1911,每当一个空白的日期需要到表,因为我已经被vb6程序员告诉,vb6日期不能设置为空。

显然,在我的课上,我有这样的日期:

public DateTime? ExampleDate { get;set; }

这会导致字段显示为11/11/1911,理想情况下它应该是空的,尽管我坚持将vb6更改为简单的空日期,程序员告诉我不能这样做。我知道我可以在类中创建手动属性来检查字段并相应地返回一个值,并将其标记为[NotMapped],但是表中有大量的日期,我不想为每个日期时间创建额外的属性,也不想在加载记录并添加额外不必要的代码后在代码中进行手动检查。

如果可能的话,我想做的就是创建我自己的数据类型或者方法我可以直接在类中使用也就是改变:
public DateTime? ExampleDate { get;set; }

转到如下:

public CustomDateTime? ExampleDate { get;set; }

并检查CustomDateTime并相应地返回。谁能告诉我这是可能的或推荐另一个解决方案?

编辑:那么一些自定义数据属性或类似的东西呢?

[CustomDateTime]
public DateTime? ExampleDate { get;set; }

我尝试使用自定义验证器,但这只在保存时触发,我需要在读取时触发检查。

实体框架在课堂上的检查日期

如果您确实不能修改数据库以获得有意义的值,那么一个好主意可能是拥有一个数据访问对象和一个业务对象。

我使用这个答案作为参考,如何将数据访问映射到实体框架中的业务逻辑对象。他把这个想法解释得很好。

这会给你的代码增加一些复杂性,但你的实体会保持干净。并且,如果稍后DB值被更新,并且'11/11/1911'被NULL替换,您只需要更新您的映射。

我还建议为此目的在您的实体中添加额外的字段,因为您希望保持它们干净。如果您坚持使用数据库中的值表示您认为的null DateTime值,那么我会使用扩展方法。

这样你就不必重复你的代码,你可以保持你的实体干净…像这样:

namespace Project.DateTimeExtensions
{
    public static class DateTimeExtensions
    {
        public static DateTime? FromVb6DateTime(this DateTime? dateTime)
        {
            // Is the DateTime a VB6 null representation, if so, return null
            return (dateTime.ToString("dd/MM/yyyy") == "11/11/1911") ? dateTime : null;
        }
    }
}

您可以确保在某些条件下将值转换为null:

// Using the extension namespace
using Project.DateTimeExtensions;
public class MyClass()
{
    public IDataService DataService;
    public MyClass(IDataService dataService)
    {
         this.DataService = dataService
    }
    public void MyMethod()
    {
        // Get the date time value however you would normally
        var vb6DateTime = this.DataService.GetDate();
        // Convert the value using the extension method
        var convertedDateTime = vb6DateTime.FromVb6DateTime();
    }
}