Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架-数据库集包含空实体_C#_Entity Framework_Dbset - Fatal编程技术网

C# 实体框架-数据库集包含空实体

C# 实体框架-数据库集包含空实体,c#,entity-framework,dbset,C#,Entity Framework,Dbset,我打算先向DbSet添加一个实体,并将上下文中的更改保存在实体框架代码中。我有大学数据库: public DbSet<University> Universities { get; set; } 创建部门实体: Department d = entities.Departments.OrderByDescending(o =>o.DepartmentId).FirstOrDefault(); int newDepartmentId = (d == null ? 1 : d.D

我打算先向DbSet添加一个实体,并将上下文中的更改保存在实体框架代码中。我有大学数据库:

public DbSet<University> Universities { get; set; }
创建部门实体:

Department d = entities.Departments.OrderByDescending(o =>o.DepartmentId).FirstOrDefault();
int newDepartmentId = (d == null ? 1 : d.DepartmentId + 1);

var department = new Department();
department.DepartmentId = newDepartmentId;
department.DepartmentName = DepartmentComboBox3.SelectedItem.ToString();
创建大学实体:

Faculty f = entities.Faculties.OrderByDescending(o => o.FacultyId).FirstOrDefault();
int newFacultyId = (f == null ? 1 : f.FacultyId + 1);

var faculty = new Faculty();
faculty.FacultyId = newFacultyId;
faculty.FacultyName = FacultyComboBox2.SelectedItem.ToString();
University uni = entities.Universities.OrderByDescending(o => o.UniversityId).FirstOrDefault();
int newUniId = (uni == null ? 1 : uni.UniversityId + 1);

var university = new University();

university.UniversityId = newUniId;
university.UniversityName = UniversityComboBox1.Text;

university.UniversityFaculties.Add(faculty);
university.UniversityDepartments.Add(department);
university.Students.Add(student);

student.Universities.Add(university);
faculty.University = university;
department.University = university;
faculty.Students.Add(student);
department.Students.Add(student);
创建术语实体:

Term t = entities.Terms.OrderByDescending(o => o.TermId).FirstOrDefault();
int newTermId = (t == null ? 1 : t.TermId + 1);

var term = new Term();

term.TermId = newTermId;
term.TermTerm = int.Parse(TermComboBox1.Text);
term.TermYear = int.Parse(YearComboBox1.Text);

term.Students.Add(student);
student.Terms.Add(term);
term.university = university;
以及我的DbSet增补:

   entities.Faculties.Add(faculty);
   entities.Departments.Add(department);
   entities.Universities.Add(university);
   entities.Terms.Add(term);
   entities.SaveChanges();
但我得到了验证失败的错误,所以我使用try-catch块来分析异常。我意识到我的大学数据库集包含一个空的大学实体。当我调试时,我意识到它们来自于我为确定实体ID而创建的实体。我试图在数据库集中获取空值并将其删除,但无法通过这种方式完成。屏幕截图如下:


其他DbSet没有这个问题。我不知道如何解决这个问题。任何帮助都将不胜感激。谢谢。

答案可能是,您将大学一次直接添加到DbSet中,然后再通过学院和大学之间的关系添加

当您通过
DbSet.add(entity)
将实体添加到上下文时,该实体的整个图形将与它一起附加到基础上下文,并且该图形中的所有实体都设置为添加状态,根实体已添加的情况除外。因此,当你把你的教员、学期和系与大学联系起来,然后把这四个因素都加在一起,你会得到比你期望的那所大学更多的东西。我不能百分之百确定发生了什么,因为正如您所说,您正在手动生成Id值,并且您还没有公开您的整个模型

我认为有三种方法可以解决这个问题:

1:将关系分配更改为在教员、学期和系上使用大学ID,或完全删除分配并依赖集合分配的关系:

uni = entities.Universities.OrderByDescending(o => o.UniversityId).FirstOrDefault();
int newUniId = (uni == null ? 1 : uni.UniversityId + 1);

var university = new University();
university.UniversityId = newUniId;
university.UniversityName = UniversityComboBox1.Text;

// these lines are sufficient to build the relationships between entities, you don't have to set both sides
university.UniversityFaculties.Add(faculty);
university.UniversityDepartments.Add(department);
university.Students.Add(student);

student.Universities.Add(university);
// use foreign key properties to build the relationship without having large graphs when adding to context
faculty.UniversityId = newUniId;
department.UniversityId = newUniId;

faculty.Students.Add(student);
department.Students.Add(student);
2:不要将大学添加到上下文中

entities.Faculties.Add(faculty);
entities.Departments.Add(department);
// entities.Universities.Add(university);
entities.Terms.Add(term);
entities.SaveChanges();

3:在域驱动设计中,聚合根的概念仅通过添加根实体来处理此问题,通过根实体访问相关实体。

答案可能是,您将大学一次直接添加到DbSet中,然后再通过学院与大学之间的关系添加。在领域驱动设计中,聚合根的概念仅通过添加根来解决这一问题,而根隐含地添加了相关实体。教员、学期和系的建设者正是创建了这所大学。似乎其中一些是在附加这些对象之前才设置的,请尝试删除这些分配,因为您将大学设置为一个整体。我做到了!我按照@DevilSuichiro说的做了。我删除了在建设者中发生的大学分配,问题解决了!谢谢你的建议!我将尽快学习领域驱动设计的根。谢谢你的评论和指导“strongbutgood”,这不完全是真的。.Add语句将把树添加到对象图(ChangeTracker,实际上不是DbSet),除非对象已经在上下文中。这是为了避免将多个对象附加到DbSet,因为DbSet实际上并不附加导航属性。另外,您的答案建议使用多个对应对象树的源,这将使任何保存方法变得不必要的复杂。@DevilSuichiro指出,我将更新以更准确地阐明发生了什么。
entities.Faculties.Add(faculty);
entities.Departments.Add(department);
// entities.Universities.Add(university);
entities.Terms.Add(term);
entities.SaveChanges();