EF代码优先+从父母删除子对象?

时间:2011-01-16 21:15:36

标签: c# entity-framework repository ef-code-first

我的表Case和我的另一个表CaseReplies之间存在一对多的关系。我正在使用EF Code First,现在想要从Case对象中删除CaseReply,但似乎不可能这样做,因为它只是尝试从特定的CaseReply记录而不是记录本身中删除CaseId。

我试图在没有运气的情况下在数据库级别设置级联删除/更新...

简短:Case只删除了它自己和CaseReply之间的关系..它不会删除CaseReply。

我的代码:

// Case.cs(案例对象)

public class Case
{
    [Key]
    public int Id { get; set; }

    public string Topic { get; set; }

    public string Message { get; set; }

    public DateTime Date { get; set; }

    public Guid UserId { get; set; }

    public virtual User User { get; set; }

    public virtual ICollection<CaseReply> Replies { get; set; }
}

// CaseReply.cs(CaseReply Object)

public class CaseReply
{
    [Key]
    public int Id { get; set; }

    public string Message { get; set; }

    public DateTime Date { get; set; }

    public int CaseId { get; set; }

    public Guid UserId { get; set; }

    public virtual User User { get; set; }

    public virtual Case Case { get; set; }
}

// RepositoryBase.cs

public class RepositoryBase<T> : IRepository<T> where T : class
{
    public IDbContext Context { get; private set; }
    public IDbSet<T> ObjectSet { get; private set; }

    public RepositoryBase(IDbContext context)
    {
        Contract.Requires(context != null);

        Context = context;

        if (context != null)
        {
            ObjectSet = Context.CreateDbSet<T>();

            if (ObjectSet == null)
            {
                throw new InvalidOperationException();
            }
        }
    }

    public IRepository<T> Remove(T entity)
    {
        ObjectSet.Remove(entity);
        return this;
    }

    public IRepository<T> SaveChanges()
    {
        Context.SaveChanges();
        return this;
    }
}

// CaseRepository.cs

public class CaseRepository : RepositoryBase<Case>, ICaseRepository
{
    public CaseRepository(IDbContext context)
            : base(context)
    {
        Contract.Requires(context != null);
    }

    public bool RemoveCaseReplyFromCase(int caseId, int caseReplyId)
    {
        Case caseToRemoveReplyFrom = ObjectSet.Include(x => x.Replies).FirstOrDefault(x => x.Id == caseId);
        var delete = caseToRemoveReplyFrom.Replies.FirstOrDefault(x => x.Id == caseReplyId);

        caseToRemoveReplyFrom.Replies.Remove(delete);

        return Context.SaveChanges() >= 1;
    }
}

提前致谢。

3 个答案:

答案 0 :(得分:1)

如果您希望EF从父对象集合中删除它时从数据库中删除CaseReply,则必须使用识别关系。这意味着您的CaseReply必须具有基于IdCaseId列的复合主键。

答案 1 :(得分:0)

我相信您使用的是EF CT4?我也有同样的问题,讨厌它。我认为你的代码完全没问题。

由于您的关联是一对多,唯一的解决方案是在数据库端设置级联删除。 &LT; http://blogs.msdn.com/b/alexj/archive/2009/08/19/tip-33-how-cascade-delete-really-works-in-ef.aspx&GT;

上述解决方案适用于在删除父记录时删除孤儿。我希望它也能解决你的问题。

答案 2 :(得分:0)

您必须从上下文中删除。如果要在db中删除它,请重写。 你现在正在做的是将它从案例的回复集合中删除,这将删除关联。所以你必须打电话:

context.Replies.Remove(delete)