【问题标题】:Entity Framework losing data after restarting from List从列表重新启动后实体框架丢失数据
【发布时间】:2015-03-10 19:52:39
【问题描述】:

我在使用 C# ASP 编写的网站遇到问题,该网站使用 Entity Framework 作为数据库。我用来存储和检索称为 DowntimeEvent 的数据的数据模型之一包含 2 个列表 AffectedSystems 和 AffectedDepartments。当我在 Visual Studio 中运行应用程序时,这些列表可以很好地存储和检索。但是,如果我停止并重新启动应用程序,DowntimeEvents 仍然存储在我的数据库中,但是当我尝试检索受影响部门和受影响系统的列表时,它们是空的。

这是我用来存储数据的模型

public class DowntimeEventModel
{
    [Key]
    public int ID { get; set; }
    [Required]
    public DateTime StartDateTime { get; set; }
    [Required]
    public DateTime EndDateTime { get; set; }
    public int LocationID { get; set; }
    [Required]
    public string Description { get; set; }
    //public int DepartmentID { get; set; }
    //public int SystemID { get; set; }
    public virtual ICollection<int> AffectedSystems { get; set; }
    public virtual ICollection<int> AffectedDepartments { get; set; }
    //public virtual ICollection<SystemModel> AffectedSystems { get; set; }
    //public virtual ICollection<DepartmentModel> AffectedDepartments { get; set; }
}

这是我如何保存数据的示例控制器,顺便说一句,这似乎在存储列表方面工作得很好。

[HttpPost]
    public ActionResult DowntimeEvent(DowntimeEventModel downtimeEvent)
    {
        PowerteqContext.DowntimeEvents.Add(downtimeEvent);
        PowerteqContext.SaveChanges();
        return View(SetupDowntimeEventViewModel());
    }

正是这种方法提示我在尝试编写此报告并试图弄清楚为什么 AffectedSystems 有时为空而有时不为空后,数据检索存在问题。在内部 foreach 循环中,我尝试直接访问 ListAffectedSystems 只是为了查看循环是否可能不是 null 并且它是在重新启动之后,但如果我添加它们并且不重新启动则不是。

        public ActionResult ReportUptimeBySystems()
    {

        var EndTime = DateTime.Now;
        var StartTime = DateTime.Now.AddDays(-28);
        var uptimeHours = new TimeSpan(1);
        if (EndTime != StartTime)
            uptimeHours = EndTime - StartTime;

        List<ReportUptimeBySystem> SysUps = new List<ReportUptimeBySystem>();
        var DownTimes = PowerteqContext.DowntimeEvents.AsEnumerable();
        var Systems = PowerteqContext.Systems.AsEnumerable();

        foreach (var x in Systems)
        {
            ReportUptimeBySystem sys = new ReportUptimeBySystem();
            sys.SystemTimeUP = uptimeHours;
            sys.SystemName = x.SystemName;
            foreach (var y in DownTimes)
            {
                if(PowerteqContext.DowntimeEvents.Find(y.ID).AffectedSystems.Contains(x.ID))
                {
                    sys.SystemTimeUP -= y.StartDateTime - y.EndDateTime;
                }
            }
            SysUps.Add(sys);
        }
        return View(SysUps);
    }

另一位开发人员建议问题可能出在我的实体框架配置中。但我什至不知道该去哪里解决这个问题。

作为参考,可以在此处找到整个应用程序。我使用的数据库是 Microsoft SQL Serverhere

【问题讨论】:

    标签: c# sql-server asp.net-mvc entity-framework asp.net-mvc-4


    【解决方案1】:

    实体框架只有在找到表示另一个实体集合的属性时才会自动加载关系。它还必须能够识别外键。按照标准,SystemModel 和 DepartmentModel 应该有一个属性 DowntimeEventID,否则您必须告知它如何为您执行此操作。

    您还应该确保延迟加载未被禁用。

    https://msdn.microsoft.com/en-us/data/jj574232.aspx

    Disable lazy loading by default in Entity Framework 4

    这是来自相关问题的一个很好的例子。 Many-to-many mapping table

    public class DowntimeEventModel
    {
        [Key]
        public int ID { get; set; }
        [Required]
        public DateTime StartDateTime { get; set; }
        [Required]
        public DateTime EndDateTime { get; set; }
        public int LocationID { get; set; }
        [Required]
        public string Description { get; set; }
        public virtual ICollection<SystemModel> AffectedSystems { get; set; }
        public virtual ICollection<DepartmentModel> AffectedDepartments { get; set; }
    }
    

    【讨论】:

      【解决方案2】:

      假设AffectedSystemsAffectedDepartments 也是EF 实体,DowntimeEventModel 与外键链接,您可以尝试在获取DowntimeEventModel 结果时明确包含它们:

      PowerteqContext.DowntimeEventModel.Include("DowntimeEventModel.AffectedSystems").Include("DowntimeEventModel.AffectedDepartments").ToList();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-16
        • 1970-01-01
        • 1970-01-01
        • 2016-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多