1

Casemy tableと my other table の間に 1 対多の関係がありますCaseReplies。私はEF Code Firstを使用していCaseReplyて、Caseオブジェクトからaを削除したいと考えていますが、レコード自体ではなく特定の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;
    }
}

前もって感謝します。

4

3 に答える 3

1

親のオブジェクト コレクションからEF を削除するCaseReplyときに EF を DB から削除する場合は、識別関係を使用する必要があります。これは、列CaseReplyに基づく複合主キーが必要であることを意味します。IdCaseId

于 2011-01-17T12:04:19.687 に答える
0

コンテキストから削除する必要があります。dbで削除する場合は返信します。現在行っているのは、関連付けを削除するケースの返信コレクションから削除することです。だからあなたは電話しなければなりません:

context.Replies.Remove(delete)
于 2011-03-02T07:01:29.397 に答える
0

EF CT4を使用していると思いますか?私も同じ問題を抱えていて、それが嫌いでした。あなたのコードはまったく問題ないと思います。

関連付けは 1 対多であるため、唯一の解決策は、データベース側でカスケード削除を設定することです。< http://blogs.msdn.com/b/alexj/archive/2009/08/19/tip-33-how-cascade-delete-really-works-in-ef.aspx >

上記の解決策は、親レコードを削除する際に孤児を削除するために機能します。あなたの問題も解決することを願っています。

于 2011-01-18T14:18:13.890 に答える