在EntityFramework

时间:2015-08-26 13:57:41

标签: c# entity-framework

我正在使用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'

1 个答案:

答案 0 :(得分:0)

我意识到你可能会尽可能地让事情变得简单明了,但是可能需要尽快分离你的顾虑。

假设这是一个XAML UI,你可以使用像MVVM Light或Prism这样的框架

如果不是基础,你想要某种调解员(http://www.blackwasp.co.uk/mediator.aspx

所以我的想法是你会有一些服务类调用保存数据,然后引发消息/事件,说明数据已更新。 您将为该事件的引发注册一个处理程序,以相应地更新视图模型。

希望这是有道理的。