我的数据库发生了困惑情况。
由于我无法确定的原因,每当我从我的 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
实体,以及关联的 Teacher
和 Class
(结果,有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/