gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:00:39 25 4
gpt4 key购买 nike

我的数据库发生了困惑情况。由于我无法确定的原因,每当我从我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com