[英]EF Code first + Delete Child Object from Parent?
我的表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对象)
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;
}
}
提前致谢。
如果希望EF在从父对象的对象集合中删除CaseReply
从数据库中删除CaseReply
,则必须使用标识关系。 这意味着您的CaseReply
必须具有基于Id
和CaseId
列的复合主键。
我相信您正在使用EF CT4? 我也有同样的问题,讨厌它。 我认为您的代码完全可以。
由于您的关联是一对多的,因此唯一的解决方案是在数据库端设置级联删除。 < http://blogs.msdn.com/b/alexj/archive/2009/08/19/tip-33-how-cascade-delete-really-works-in-ef.aspx >
上述解决方案适用于在删除父记录时删除孤儿的情况。 我希望它也能解决您的问题。
您必须从上下文中删除。如果要在数据库中删除它,请回复。 您现在正在做的是从case的replies集合中删除它,从而删除了关联。 因此,您必须致电:
context.Replies.Remove(delete)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.