首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >saveChanges问题

saveChanges问题
EN

Stack Overflow用户
提问于 2011-08-21 15:14:24
回答 1查看 902关注 0票数 0

我正在尝试从数据库中删除该项目,但得到以下异常:

代码语言:javascript
复制
"DbUpdateException was unhandled"

------------------------------------------------------------
public class Project
{
    public Project()
    {
        Customers = new List<Customer>();
        Materials = new List<Material>();
        Workers = new List<Worker>();
    }

    [Key]
    public long ProjectID { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateFinished { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }

    //Customer TheCustomer = new Customer();

    public ICollection<Customer> Customers { get; set; }
    public ICollection<Material> Materials { get; set; }
    public ICollection<Worker> Workers { get; set; }
}

------------------------------------------------------------------------
if (cb_Projects.SelectedValue != null)
{
    using (var db = new ProjectContext())
    {

        Project p = db.Projects.Find(cb_Projects.SelectedValue);
        if (db.Entry(p).State == EntityState.Detached)
        {
            db.Projects.Attach(p);
        }

        p.Customers.Clear();
        p.Workers.Clear();
        p.Materials.Clear();
        db.Projects.Remove(p);
        db.SaveChanges();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-21 20:02:27

当你调用这个的时候:

代码语言:javascript
复制
p.Customers.Clear();
p.Workers.Clear();
p.Materials.Clear();

您没有注意到这一点,因为它只有在填充集合时才有效,而且如果这些关系是一对多的,您还需要删除(调用Remove)每个单独的依赖实体。要填充这些集合,您必须使用预加载

代码语言:javascript
复制
long selectedValue = cb_Projects.SelectedValue;
Project p = db.Projects.Include(p => p.Customers)
                       .Include(p => p.Workers)
                       .Include(p => p.Materials)
                       .Single(p => p.ProjectID == selectedValue);

或者将所有三个属性都标记为virtual,以启用延迟加载。

你当前的代码应该通过级联删除来处理。

这也没有多大意义:

代码语言:javascript
复制
if (db.Entry(p).State == EntityState.Detached)
{
    db.Projects.Attach(p);
}

您将在上下文的新实例中搜索项目,因此它将始终从数据库加载,其状态将为Unchanged

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7136926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档