В моей базе данных я хочу создать таблицу, которая дважды ссылается на другую таблицу, используя подход «сначала код». Это код:
public class ArticleWord
{
public long ID { get; set; }
public Article? Article { get; set; }
public virtual Word Word { get; set; }
public virtual Word WordTarget { get; set; }
[ForeignKey(nameof(Word))]
public long WordId { get; set; }
[ForeignKey(nameof(WordTarget))]
public long WordTargetId { get; set; }
}
Я успешно создал миграцию, но при обновлении базы данных получаю эту ошибку
Failed executing DbCommand (107ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [ArticleWords] (
[ID] bigint NOT NULL IDENTITY,
[ArticleID] bigint NULL,
[WordId] bigint NOT NULL,
[WordTargetId] bigint NOT NULL,
[CreatedAt] datetime2 NOT NULL,
[CreatedBy] nvarchar(max) NULL,
[ModifiedAt] datetime2 NULL,
[ModifiedBy] nvarchar(max) NULL,
[IsDeleted] bit NOT NULL,
CONSTRAINT [PK_ArticleWords] PRIMARY KEY ([ID]),
CONSTRAINT [FK_ArticleWords_Articles_ArticleID] FOREIGN KEY ([ArticleID]) REFERENCES [Articles] ([ID]),
CONSTRAINT [FK_ArticleWords_Words_WordId] FOREIGN KEY ([WordId]) REFERENCES [Words] ([ID]) ON DELETE CASCADE,
CONSTRAINT [FK_ArticleWords_Words_WordTargetId] FOREIGN KEY ([WordTargetId]) REFERENCES [Words] ([ID]) ON DELETE CASCADE
);
Microsoft.Data.SqlClient.SqlException (0x80131904): Introducing FOREIGN KEY constraint
'FK_ArticleWords_Words_WordTargetId' on table 'ArticleWords' may cause cycles or multiple cascade paths.
Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Как изменить код, чтобы прочитать Word дважды?
Обновить
Я обновил модель, но получаю ту же ошибку
[Table("ArticleWords")]
public class ArticleWord : Table
{
[JsonPropertyName("article")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public Article? Article { get; set; }
[JsonPropertyName("word")]
public Word Word { get; set; }
[JsonPropertyName("wordTarget")]
public Word WordTarget { get; set; }
}
update/2
Я добавил WordID , чтобы получить возможность легко фильтровать с помощью этого идентификатора в выражении Lambda.
Обновление/3
Быстрый вопрос. Если я использую код
// Using [ForeignKey]
public class ArticleWord
{
public long ID { get; set; }
public Article? Article { get; set; }
[ForeignKey("Word")]
public long WordId { get; set; }
[ForeignKey("Word")]
public long WordTargetId { get; set; }
}
Как получить Word для WordId и WordTargetId?
return _localDb?.Set()?.Include(a => a.Tags)?
.Include(c => c.Categories)?
.Include(t => t.CustomTags)?
.Include(w => w.Words)?
.Where(art => art.ID == id)?
.FirstOrDefault();
Подробнее здесь: https://stackoverflow.com/questions/783 ... de-paths-e
EFCore: двойная ссылка на другую таблицу приводит к ошибке циклов или нескольких каскадных путей ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение