我正在使用C#和EF6开发桌面应用程序。 由于某些原因(一个是模型结构的复杂性)我决定只在整个项目的DbContext上使用,而不是每次我需要添加,更新,删除或获取任何数据时创建和处置。
假设我有2个模型
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
public class CollegeStudent : Student
{
public string Course { get; set; }
}
我在ViewModel中有一个ObservableCollection,并在我将一个项目添加到集合后实例化它。
我按以下方式将Math对象添加到数据库
public void AddStudent()
{
var obj = new Student() { Name = "Mike" };
_context.Set<Student>().Add(obj);
StudentCollection = new ObservableCollection<Student>(_context.Set<Student>().ToList());
}
当我想将学生的类型更改为CollegeStudent时,我使用以下代码
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());
}
它完美有效,并在数据库中插入CollegeStudent详细信息但是当从数据库中获取学生列表时,它会抛出以下内容 例外:
EntitySet“Students”中的所有对象必须具有唯一的主键。但是,“CollegeStudent”类型的实例和“Student”类型的实例都具有相同的主键值,'EntitySet = Students; Id = 4'
答案 0 :(得分:0)
我意识到你可能会尽可能地让事情变得简单明了,但是可能需要尽快分离你的顾虑。
假设这是一个XAML UI,你可以使用像MVVM Light或Prism这样的框架
如果不是基础,你想要某种调解员(http://www.blackwasp.co.uk/mediator.aspx)
所以我的想法是你会有一些服务类调用保存数据,然后引发消息/事件,说明数据已更新。 您将为该事件的引发注册一个处理程序,以相应地更新视图模型。
希望这是有道理的。