Сущность имеет два свойства, которые оба ссылаются на один и тот же тип сущности в отношении один ко многим - PullRequest
0 голосов
/ 17 ноября 2011

Это кажется наиболее распространенным отношением, но по какой-то причине я не могу заставить работать EF с кодом. Когда я запускаю код ниже, я получаю следующую ошибку:

* {"Введение ограничения FOREIGN KEY 'Recording_RecordingLocation' в таблицу 'Recordings' может привести к циклам или нескольким каскадным путям. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION, или измените другие ограничения FOREIGN KEY. \ R \ nНе удалось создать ограничение. См. предыдущие ошибки. "} *

Я исследовал SO и другие места, но не смог выяснить это. У меня, должно быть, небольшой инсульт, поэтому, если это дублирует, я прошу прощения. Я не думаю, что это потому, что все остальные контрольные вопросы, которые я нашел, были для отношений многие-ко-многим ... многие-к-одному.

Мой сценарий довольно прост ...

У меня есть объект (Запись), который имеет два обязательных свойства RecordingLocation и EditingLocation, оба из которых имеют одинаковый тип WorkLocation. Каждая запись имеет ровно одно расположение записи и одно расположение редактирования (не многие-ко-многим) . У меня также есть необходимые навигационные свойства.

Каждый WorkLocation является автономным и не имеет внутренней связи с записью - это просто физическое место, где выполнялась некоторая работа над этой записью. Поэтому, когда я удаляю запись, я не хочу удалять связанные WorkLocations.

public class Recording
{
    [Key]
    public virtual int Id { get; set; }

    //... other properties not shown here

    public virtual int RecordingLocationId { get; set; }
    public virtual WorkLocation RecordingLocation { get; set; }

    public virtual int EditingLocationId { get; set; }
    public virtual WorkLocation EditingLocation { get; set; }
{


public class WorkLocation
{
    [Key]
    public virtual int Id { get; set; }
    public virtual WorkLocationType Type { get; set; }
    public virtual string Description { get; set; }
    public virtual LogicalStatus Status { get; set; }
}

// I'll use this on the front-end to filter a selection list
// but don't necessarily assume a Work Location is bound to only items of this type
public enum WorkLocationType
{
    RecordingLocation,
    EditingLocation,
    MasteringLocation
}

Чего мне не хватает, чтобы заставить это работать?

1 Ответ

1 голос
/ 17 ноября 2011

Ваши свойства навигации RecordingLocation и EditingLocation являются обязательными, поскольку соответствующие свойства внешнего ключа не могут иметь значение null.По соглашению EF предполагает, что каскадное удаление активно для обязательного отношения «один ко многим», что вызывает проблему, если у вас есть более одного такого отношения, ссылающегося на одну и ту же таблицу - отсюда исключение.

Необходимо отключить каскадdelete (также, кажется, ваша бизнес-логика требует этого), что возможно только в Fluent API:

public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Recording>()
            .HasRequired(r => r.RecordingLocation)
            .WithMany()
            .HasForeignKey(f => f.RecordingLocationId)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Recording>()
            .HasRequired(r => r.EditingLocation)
            .WithMany()
            .HasForeignKey(f => f.EditingLocationId)
            .WillCascadeOnDelete(false);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...