奇妙な問題が発生しました。通常、この例外が発生する理由と、プロパティの1つでWillCascadeOnDeleteをFalseに無効にすることで解決する方法についてはすでに知っています。
しかし、私の問題は他の種類のようです。これが私のコードです:
メンバー:
public class Memeber
{
public int MemberID { get; set; }
public virtual ICollection<Message> SentMessages { get; set; }
public virtual ICollection<Message> RecievedMessages { get; set; }
}
public class Message
{
public long MessageID { get; set; }
public int SenderMemberId{ get; set; }
public virtual ICollection<Member> RecipientsMembers { get; set; }
[ForeignKey("SenderMemberId")]
public virtual Member SenderMember { get; set; }
}
そして、ここにマッピングがあります: メッセージ構成:
this.HasRequired(c => c.SenderMember)
.WithMany(c => c.SentMessages)
.HasForeignKey(c => c.SenderMemberId)
.WillCascadeOnDelete(false);
そして MemberConfiguration で:
this.HasMany(c => c.RecievedMessages)
.WithMany(c => c.RecipientsMembers)
.Map(cm =>
{
cm.ToTable("MessageJoinMemeber");
cm.MapLeftKey("MessageId");
cm.MapRightKey("MemberId");
});
ご覧のとおり、メッセージには、1 対多の双方向の、ForeignKey SenderID を持つ送信者が含まれています。メンバーには、受信者として 1 つと送信者として 1 つのリストの 2 つのメッセージ リストがあります。これらのリレーションの 1 つ (最初のもの) で削除時にカスケードを無効にしようとしましたが、SQL エンジンから同じ問題が発生します。また、メンバー部分からではなく、メッセージ部分からの関係を定義しようとしました:
this.HasMany(c => c.RecipientsMembers)
.WithMany(c=> c.RecievedMessages)
.Map ( cm =>
{
cm.ToTable("MessageJoinMemeber");
cm.MapLeftKey("MessageId");
cm.MapRightKey("MemberId");
});
しかし、常にこのエラーが発生します:
System.Data.SqlClient.SqlException was unhandled by user code
HResult=-2146232060
Message=Introducing FOREIGN KEY constraint 'FK_dbo.MessageJoinMemeber_dbo.Messages_MemberId' on table 'MessageJoinMemeber' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint. See previous errors.
Source=.Net SqlClient Data Provider
ErrorCode=-2146232060
Class=16
LineNumber=1
Number=1785
Procedure=""
Server=KINGPC
State=0
StackTrace:
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)