【发布时间】:2018-08-03 00:57:50
【问题描述】:
我使用 Entity Framework Core,并且我有一个表:
public class BlogComment
{
public int Id { get; set; }
public BlogPost Post { get; set; }
[StringLength(100)]
public string AuthorName { get; set; }
[StringLength(254)]
public string AuthorEmail { get; set; }
public bool SendMailOnReply { get; set; }
[StringLength(2000)]
public string Content { get; set; }
public DateTime CreatedTime { get; set; }
public int? ReplyToId { get; set; }
public BlogComment ReplyTo { get; set; }
}
据此,EFC 生成下表:
CREATE TABLE [dbo].[BlogComment] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[AuthorEmail] NVARCHAR (254) NULL,
[AuthorName] NVARCHAR (100) NULL,
[Content] NVARCHAR (2000) NULL,
[CreatedTime] DATETIME2 (7) NOT NULL,
[PostId] INT NULL,
[ReplyToId] INT NULL,
[SendMailOnReply] BIT NOT NULL,
CONSTRAINT [PK_BlogComment] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_BlogComment_BlogPost_PostId] FOREIGN KEY ([PostId]) REFERENCES [dbo].[BlogPost] ([Id]),
CONSTRAINT [FK_BlogComment_BlogComment_ReplyToId] FOREIGN KEY ([ReplyToId]) REFERENCES [dbo].[BlogComment] ([Id])
);
GO
CREATE NONCLUSTERED INDEX [IX_BlogComment_PostId]
ON [dbo].[BlogComment]([PostId] ASC);
GO
CREATE UNIQUE NONCLUSTERED INDEX [IX_BlogComment_ReplyToId]
ON [dbo].[BlogComment]([ReplyToId] ASC) WHERE ([ReplyToId] IS NOT NULL);
一些 cmets 作为回复发送给另一个,但不是全部。删除原评论后,回复变为普通评论。所以,在this tutorial之后,配置看起来是这样的:
modelBuilder.Entity<BlogComment>()
.HasOne(p => p.ReplyTo)
.WithOne()
.HasForeignKey<BlogComment>(c => c.ReplyToId)
.IsRequired(false)
.OnDelete(DeleteBehavior.SetNull);
删除方法很简单:
var comment = await context.BlogComment.Include(c => c.ReplyTo).SingleAsync(m => m.Id == id);
context.BlogComment.Remove(comment);
await context.SaveChangesAsync();
但是我不能运行它,我得到一个错误:
System.Data.SqlClient.SqlException:DELETE 语句与 SAME TABLE REFERENCE 约束“FK_BlogComment_BlogComment_ReplyToId”冲突。
我该如何解决这个问题?
【问题讨论】:
-
从您的代码中删除
.Include(c => c.ReplyTo) -
@viveknuna 起初我没有包含它,现在我删除了,但我得到了同样的错误。
-
你能检查一下ReplyToId在数据库表中是否可以为空吗?
-
@viveknuna 是的。我将表格的代码添加到问题中。该表现在有几个 cmets 不是对另一个的回复,即
ReplyToId为空。 -
对不起,我不知道。也许您可以在保存更改之前尝试
comment.ReplyTo = null;。
标签: entity-framework entity-framework-core cascade one-to-one