【问题标题】:EF CodeFirst DateTime in nested object嵌套对象中的EF Code First DateTime
【发布时间】:2018-02-27 08:40:27
【问题描述】:

在我们的 EF 模型中,我们有很多 To/From (DateTime) 成员。昨天我尝试了一个新概念,我将这些 To/from 放在一个新类(DateTimePeriod)中,以使生活更轻松。

例子

public partial class SomeEfModel
{
    [Key]
    public int Id { get; set; }
    public DateTimePeriod Time { get; set; }
}
public class DateTimePeriod
{
    public DateTime From { get; set; }
    public DateTime To { get; set; }
}

这按预期工作,但我意识到 Time 有时会为空。由于 EF 在数据库中将 From/To 创建为不可为空,因此 Time 不能为空。

我能否以某种方式在代码中仍然将 From/To 设为不可为空,但让它们在数据库中可以为空?如果它们为 null,则从 DB 获取时 Time-property 应该为 null。

哦,实体框架 6.0 顺便说一句。

提前致谢。

【问题讨论】:

  • 时间属性(From 和 To 列)应该是同一个表 (SomeEfModel) 的一部分,还是可以保存在单独的表中?
  • @AndriyTolstoy 我们希望与模型的其余部分在同一个表中。
  • 所以你想使用表拆分(使用同一张表)来实现 1 到 0...1 的关系。我认为它不受 EF 支持。
  • @AndriyTolstoy 感谢您的回答,尽管我不喜欢它的结果。 ;)

标签: c# asp.net .net entity-framework


【解决方案1】:

是的,你可以。您应该使用可为空的属性定义您的类,然后在业务层中映射一个 dto 以使用不可为空的值。

public partial class SomeEfModel
{
    [Key]
    public int Id { get; set; }
    public DateTimePeriod Time { get; set; }
}
public class DateTimePeriod
{
    public DateTime? From { get; set; }
    public DateTime? To { get; set; }
}

在此之后,您应该创建一个单独的类来映射 DateTimePeriod 的一些默认值:

public class DateTimePeriodDto
{
    public DateTime From {get; set; }
    public DateTime To {get; set; }

    public DateTimePeriodDto(DateTimePeriod dataObject)
    {
        From = dataObject.From ?? //put a default value
        To = dataObject.To ?? //put a default value
    }
}

最后你应该有这样的东西:

public partial class SomeEfModelDto
{
    public int Id { get; set; }
    public DateTimePeriodDto Time { get; set; }
    public SomeEfModelDto(SomeEfModel model)
    {
        Id = model.Id;
        Time = new DateTimePeriodDto(model.DateTimePeriod);
    }
}

【讨论】:

  • 感谢您的回复,但是由于项目的设置方式,这种方法使用起来会有问题。 ://
  • 不客气,通常在我们构建的所有项目中,我们都有单独的业务层。它使解耦变得容易。
猜你喜欢
  • 2013-04-12
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多