C# 更改EntityFramework中的对象类型
我正在使用C#和EF6开发一个桌面应用程序。 出于某些原因(其中一个原因是模型结构的复杂性),我决定在整个项目中只使用DbContext,而不是在每次需要添加、更新、删除或获取任何数据时创建和处理 假设我有两个模型C# 更改EntityFramework中的对象类型,c#,entity-framework,C#,Entity Framework,我正在使用C#和EF6开发一个桌面应用程序。 出于某些原因(其中一个原因是模型结构的复杂性),我决定在整个项目中只使用DbContext,而不是在每次需要添加、更新、删除或获取任何数据时创建和处理 假设我有两个模型 public class Student { public int Id { get; set; } public string Name { get; set; } } public class CollegeStudent : Student { pub
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
public class CollegeStudent : Student
{
public string Course { get; set; }
}
我在ViewModel中有一个ObservableCollection,并在向集合中添加一个项后将其实例化
我通过以下方式向数据库添加和Student对象
public void AddStudent()
{
var obj = new Student() { Name = "Mike" };
_context.Set<Student>().Add(obj);
StudentCollection = new ObservableCollection<Student>(_context.Set<Student>().ToList());
}
public void AddStudent()
{
var obj=new Student(){Name=“Mike”};
_context.Set().Add(obj);
StudentCollection=新的ObservableCollection(_context.Set().ToList());
}
当我想把学生的类型改成大学生时,我使用下面的代码
public void AddCollegeStudent(CollegeStudent obj)
{
var original = _context.Set<Student>().Find(obj.Id);
var obj = new Student()
{
Id = original.Id,
Name = original.Name,
Course = "Some Course",
}
_context.Database.ExecuteSqlCommand("INSERT INTO CollegeStudent (Id, Course) VALUES (obj.Id, '" + obj.Course + "');");
StudentCollection = new ObservableCollection<Student>(_context.Set<Student>().ToList());
}
public void addCollegestStudent(CollegestStudent obj)
{
var original=_context.Set().Find(obj.Id);
var obj=新学生()
{
Id=原始的.Id,
Name=original.Name,
Course=“Some Course”,
}
_context.Database.ExecuteSqlCommand(“插入到大学生(Id,课程)值中(obj.Id,“+obj.Course+”);”;
StudentCollection=新的ObservableCollection(_context.Set().ToList());
}
它可以完美地工作并在数据库中插入学院学生的详细信息,但是当从数据库中获取学生列表时,它会抛出以下命令
例外情况:
EntitySet“Students”中的所有对象必须具有唯一的主键。但是,“CollegeStudent”类型的实例和“Student”类型的实例都具有相同的主键值“EntitySet=Students”;Id=4'
我决定在整个项目中只使用DbContext,而不是在每次需要添加、更新、删除或获取任何数据时创建和处置
这是你的问题
这就是为什么不应该为整个应用程序创建一个单一的
DbContext
——对底层数据的更改可能会使上下文中的数据无效。上下文是指在每次DB操作中创建和处理的。它们是轻量级的,所以创建大量它们应该不是一个大问题 我意识到你可能会试图让事情尽可能直截了当,但尽早将你的顾虑分开可能是值得的
假设这是一个XAML UI,您可以使用MVVM Light或Prism之类的框架
希望这是有意义的。如果我不想使用单个DbContext,那么每次向上下文添加或更新项目时,我都必须将所有对象重新加载到ObservableCollectionw,它绑定到一个列表框,以便向用户显示所有项目。