2015-01-06 6 views
1

Я использую код Entity для моего проекта. В основном у меня есть 3 класса Users, Branchs и UsersBranchs.Entity Framework, ограничение внешнего ключа может вызвать циклы или несколько каскадных путей

Users содержит UserID, Name ...

Branchs содержит BranchID, Location ... и Идентификатор_пользователь, который относится к создателю ветви и UsersBranchs просто есть два столбец BranchID и UserID, который определяет, какие пользователь, в котором филиал

проблема я получаю эту ошибку:

'FK_dbo.UsersBranchs_dbo.Users_UsersID' on table 'UsersBranchs' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

Вы можете мне помочь?

Update
Это UsersBranchs Класс

[ForeignKey("UserID")] 
public CoreUsers User { get; set; } 
public Guid UsersID { get; set; } 

[ForeignKey("BranchID")] 
public Branchs Branch { get; set; } 
public Guid BranchID { get; set; } 


А также добавить эту строку в класс DbContext использовать как UserID и BranchID как ключ

 
modelBuilder.Entity<UsersBranchs>().HasKey(x => new { x.UserID, x.BranchID }); 


Филиалы Класс

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [Key] 
    public Guid ID { get; set; } 

    [ForeignKey("UserID")] 
    public CoreUsers User { get; set; } 
    public Guid UserID { get; set; } 

    public ..... 


Пользователи Класс

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [Key] 
    public Guid ID { get; set; } 

    public ..... 
+0

Получаете ли вы это сообщение на SQL-сервере? –

+0

Вы также должны показать настройки PK & FK. – Raptor

+0

У меня была аналогичная проблема и я нашел решение, пожалуйста, посмотрите здесь http://stackoverflow.com/questions/27613117/introducing-foreign-key-constraint-may-cause-cycles-or-multiple-cascade-paths- s – Mindless

ответ

1

Не будучи в состоянии handle multiple cascade paths и cascade delete to same table было ограничение Sql Server в течение длительного времени. Просто Google сообщение об ошибке. В принципе, если вы хотите использовать каскадное удаление, вам нужно убедиться, что существует только один каскадный путь.

На данный момент у вас есть два пути от филиалов -> UsersBranchs and Branchs -> Users -> UsersBranchs.

EF по умолчанию устанавливает каскадное удаление, но его можно остановить, удалив соглашения в вашем DbContext.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    // Manually set cascade delete behaviour 
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
    modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); 

    base.OnModelCreating(modelBuilder); 
} 

Тогда вам придется установить WillCascadeOnDelete (истинный) на любых отношениях, где вы хотите, каскадное удаление. См. Entity Framework documentation.

Кроме того, ваша модель кажется немного странной. Вы выглядите так, как будто вы пытаетесь создать таблицу ссылок/соединений для многих-ко-многим, UsersBranchs, но у вас также есть один пользователь в филиалах, который на самом деле не имеет смысла. Вам даже нужна таблица UsersBranchs в этом случае? Вы имели в виду коллекцию пользователей в ваших филиалах, т. Е. Свойство навигации, а не внешний ключ, который дает отношения «один ко многим» «Ветки» -> «Пользователи»?

Как в стороне, мне очень не нравится использование множественных чисел для отдельных объектов.

+0

Я использую пользователя в классе ветвей (таблица) для отслеживания, чтобы найти, кто создает эту ветвь, и другие многие для многих (UsersBranchs), чтобы найти членов ветвей. он делает сцены? В другой руке я часто делаю флаг IsDeleted для отслеживания удаленных записей и сохранения их в базе данных. Благодарим за руководство. – Ostad

0

Я думаю, что вы получаете эту проблему, потому что вы не сказали рамки Entity, как он будет относиться к этим классам на удаление на каскаде

в классе DbContext, переопределить метод OnModelCreating и написать этот код

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{  
    modelBuilder.Entity<UserBranch>() 
     .HasRequired(t => t.CoreUsers) 
     .WithMany() 
     .HasForeignKey(t => t.UserID) 
     .WillCascadeOnDelete(false); 

    modelBuilder.Entity<UserBranch>() 
     .HasRequired(t => t.Branch) 
     .WithMany() 
     .HasForeignKey(t => t.BranchID) 
     .WillCascadeOnDelete(false); 

    modelBuilder.Entity<Branch>() 
     .HasRequired(t => t.User) 
     .WithMany() 
     .HasForeignKey(t => t.UserID) 
     .WillCascadeOnDelete(false); 
} 

надеюсь, что это вам поможет

+0

Спасибо Хади, проблема решена – Ostad

+0

@ Оста, пожалуйста, как вы ее решили? используя мой ответ? если да, пожалуйста, отметьте это как ответ и проголосовате, спасибо заранее – Monah

Смежные вопросы