c# - EF 6 : Removing entities results in empty objects

标签 c# database entity-framework

我的数据库发生了困惑情况。 由于我无法确定的原因,每当我从我的 DbContext(称为 DataRepository)持有的 DbSet 中删除一个项目时,会添加另外三个相同类型的“空”项目。

这是我的 Teacher 实体的代码(它继承自 User,我使用 TPT 继承来处理它)。

public class Teacher
    : User
{
    public string Title { get; set; }
    public string Email { get; set; }

    public virtual Department Department { get; set; }
    public virtual List<Class> Classes { get; set; }

    public virtual List<Booking> Bookings { get; set; }

    public Teacher()
    {
        Department = new Department();
        InternalBookings = new List<Booking>();
        Classes = new List<Class>();

        Access = AccessMode.Teacher;

        Title = string.Empty;
        Email = string.Empty;
    }
}

同样,部门实体。

public class Department
{
    public string Name { get; set; }

    public virtual List<Teacher> Teachers { get; set; }
    public virtual List<Room> Rooms { get; set; }

    public Department()
    {
        Teachers = new List<Teacher>();
        Rooms = new List<Room>();

        Name = string.Empty;
    }
}

编辑:DataRepository 代码的相关部分:

public class DataRepository
    : DbContext
{
    public virtual DbSet<Booking> Bookings { get; set; }
    public virtual DbSet<Department> Departments { get; set; }
    public virtual DbSet<Class> Classes { get; set; }

    public DataRepository()
        : base(@"data source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=" + Path + ";Database=Data;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework")
    {
        Database.SetInitializer(new DropCreateDatabaseAlways<DataRepository>());
    }
}

然后,在一些测试代码中,我有:

using (DataRepository Repo = new DataRepository())
{
    Repo.Bookings.Remove(Repo.Bookings.Single(b => b.Id == 1));
    Repo.Teachers.Remove(Repo.Teachers.Single(t => t.FirstName == "R...."));
    Repo.Classes.Remove(Repo.Classes.Single(c => c.Owner == Repo.Teachers.FirstOrDefault(t => t.FirstName == "R....")));
    Repo.SaveChanges();
}

这只是删除了 Db 中的一个 Booking 实体,以及关联的 TeacherClass(结果,有Db 中没有孤立的实体)。

问题是运行此代码后,DbContext 中 Department 的 DbSet 有三个额外的空项。我可以在 Department 的构造函数中放置一个断点,然后查看正在创建的新对象。从调用堆栈可以推断它是由迭代器创建的,但肯定不会将它添加到数据库中吗?

另一个奇怪的效果是,通过使用 Repo.Bookings.Remove(Repo.Bookings.ToList().Single(b => b.Id == 1)),我最终取而代之的是 7 个新项目。

我想我在这里遗漏了一些非常重要的东西,所以感谢任何帮助。


解决方案是在其他条目的构造函数中删除条目的所有初始化 - 列表初始化没问题,只是条目本身不行。

最佳答案

Teacher 的空构造函数创建了一个没有名称的新 Department(因此是空项目)。 EF 注意到“更改”并将其保存到 Departments 表。

EF 需要无参数构造函数来创建它要从查询返回的对象,但在您的情况下,只需创建这些对象就会导致更改。它在执行查询时在内部创建的对象越多,表中的空项就越多。

关于c# - EF 6 : Removing entities results in empty objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33462952/

相关文章:

c# - 将异步方法作为 Quartz.NET 作业运行并处理对象问题

c# - ASP.NET 和 AJAX : Complete postback with a asp:Button inside an UpdatePanel

c# - 如何实现类似 "Fences"的东西

android - 如何在sqlite android数据库中增加字段

java - 使搜索引擎能够索引来自 Web 应用程序的数据

c# - Fluent API 首先在 EF Code 中实现零或一到零或一的关系

c# - 我可以使用什么来与 PLC 的 HMS AnyBus AB7007 网关进行通信

c# - HttpClient 和 SOAP (C#)

sql - oracle数据库合并多个表的结果

entity-framework - Poco+Entity Framework 4. 我应该在哪里添加使用 Poco 类的方法?