EFCore: двойная ссылка на другую таблицу приводит к ошибке циклов или нескольких каскадных путейC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 EFCore: двойная ссылка на другую таблицу приводит к ошибке циклов или нескольких каскадных путей

Сообщение Anonymous »

В моей базе данных я хочу создать таблицу, которая дважды ссылается на другую таблицу, используя подход «сначала код». Это код:
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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»