0

エンティティで同じタイプの 2 つのプロパティをマップしようとすると、次のエラーが発生します。

An exception was thrown while executing a resolve operation. See the InnerException for details. ---> Introducing FOREIGN KEY constraint 'FK_dbo.Client_dbo.Messagebox_OutboxId' on table 'Client' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

制約を作成できませんでした。以前のエラーを参照してください。(詳細については、内部例外を参照してください。)

このエラーは、同じタイプの小道具が 2 つあるという事実に関連していることを理解しています。

コードファースト+ EF流暢なAPIを使用してどのように行うことができますか?

シナリオ: それぞれClientが持ってInboxおり、Outbox両方がどちらであるかMessagebox

 public class BaseEntity
{
    public int Id { get; set; }
}

public class Client : BaseEntity
{
    /// <summary>
    /// Gets or sets Client Alias
    /// </summary>
    public string Alias { get; set; }

    /// <summary>
    /// Gets or sets value indicating if the client was deleted
    /// </summary>
    public bool Deleted { get; set; }

    /// <summary>
    /// Gets or sets client's inbox
    /// </summary>
    public virtual Messagebox Inbox { get; set; }

    /// <summary>
    /// Gets or sets inbox Id
    /// </summary>
    public int InboxId { get; set; }

    /// <summary>
    /// Gets or sets client's outbox
    /// </summary>
    public virtual Messagebox Outbox { get; set; }

    /// <summary>
    /// Gets or sets outbox Id
    /// </summary>
    public int OutboxId { get; set; }
}

public class Messagebox : BaseEntity
{
    public int ClientId { get; set; }

    /// <summary>
    /// Gets or sets the messagebox client
    /// </summary>
    public virtual Client Client { get; set; }
}
4

1 に答える 1

0

この問題は、同じ名前の 2 つのプロを使用することとは関係ありません。これは、SQL データベースがテーブル間の循環である制約を作成しようとしないことに関係しています。

以下のような流れるような API でこれを克服できます (必要に応じて調整してください)。

modelBuilder.Entity<Leaves>().HasRequired(l => l.Applicant)
                            .WithMany(bp => bp.LeavesToApply)
                            .HasForeignKey(l => l.ApplicantId)
                            .WillCascadeOnDelete(false);
modelBuilder.Entity<Leaves>().HasOptional(t => t.Approver)
                             .WithMany(bp => bp.LeavesToApprove)
                             .HasForeignKey(u => u.ApproverId)
                             .WillCascadeOnDelete(false);

問題は、カスケードをオフにする必要があるということです。そして、手動で削除するか、サイクルを削除します。

于 2013-10-09T15:16:37.657 に答える