Внешние ключи в Entity Framework - ошибка циклов или нескольких каскадных путей - PullRequest
3 голосов
/ 30 октября 2011

Использование кода EF Сначала у меня есть следующее, например:

public class Blog
{
    public int BlogID { get; set; }
    public string Content { get; set; }
    public virtual User User { get; set; }
    public virtual ICollection<BlogMeta> BlogMeta { get; set; }
}

public class BlogMeta
{
    public int BlogMetaID { get; set; }
    public string Content { get; set; }
    public virtual User User { get; set; }
    public virtual Blog Blog { get; set; }
}

Это успешно генерирует таблицы Blog и BlogMeta и создает отношение внешнего ключа с таблицей User.После прочтения this я изменил это на следующее:

public class Blog
{
    public int BlogID { get; set; }
    public string Content { get; set; }
    public int UserID { get; set; }
    public virtual User User { get; set; }
    public virtual ICollection<BlogMeta> BlogMeta { get; set; }
}

public class BlogMeta
{
    public int BlogMetaID { get; set; }
    public string Content { get; set; }
    public int UserID { get; set; }
    public virtual User User { get; set; }
    public int BlogID { get; set; }
    public virtual Blog Blog { get; set; }
}

и теперь это не работает.Он генерирует таблицы и затем выдает следующую ошибку при попытке создать отношения:

Введение ограничения FOREIGN KEY 'BlogMeta_User' в таблицу 'BlogMeta' может вызвать циклы или несколько путей каскада.1013 *

Так в чем же преимущество введения public int UserID и почему он не работает при этом?

РЕДАКТИРОВАТЬ: Хорошо, так что я столкнулся с этот ответ , который очерчивает разницу между независимыми ассоциациями и ассоциациями внешних ключей ... который, как оказалось, является тем, о чем я говорил.Таким образом, возникает вопрос: почему при использовании ассоциаций внешних ключей возникает вышеуказанная ошибка?

1 Ответ

7 голосов
/ 31 октября 2011

Как упоминал Ладислав, вы определяете несколько каскадных путей для объекта BlogMeta. Вы должны были бы отключить каскад для одного из ваших отношений.

Вы можете добавить следующий метод в свой контекстный класс для каскада diable для ваших отношений User-BlogMeta:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<BlogMeta>().HasRequired(bm => bm.User).WithMany().WillCascadeOnDelete(false);
    base.OnModelCreating(modelBuilder);
}  

Вы можете указать другой конец отношений (WithMany(u => u.BlogMetas)), если вы определили совокупность BlogMeta в вашем User классе.

...