Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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# 更改EntityFramework中的对象类型_C#_Entity Framework - Fatal编程技术网

C# 更改EntityFramework中的对象类型

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

我正在使用C#和EF6开发一个桌面应用程序。 出于某些原因(其中一个原因是模型结构的复杂性),我决定在整个项目中只使用DbContext,而不是在每次需要添加、更新、删除或获取任何数据时创建和处理

假设我有两个模型

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,它绑定到一个列表框,以便向用户显示所有项目。