2013-11-26 5 views
0

Я использую ASP.NET MVC 4 Entity Framework 5 для генерации первого переноса кода для структуры базы данных нижеприведенных классов, имеющих отношения между ними. Однако я столкнулся с проблемой, где он вызывает эту ошибку, когда я пытаюсь обновить свою базу данных из миграции:База данных, вызывающая «циклы» или «несколько каскадных путей»

Paste Bin файла миграции можно найти здесь: вернуласьhttp://pastebin.com/ngXacrKV

Ошибка:

Introducing FOREIGN KEY constraint 'FK_dbo.Bookings_dbo.Rooms_RoomId' on table 'Bookings' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

Bunk.cs

public class Bunk 
{ 
    [Key] 
    public int BunkId { get; set; } 

    public BunkStatus BunkStatus { get; set; } 

    [ForeignKey("Room")] 
    public int RoomId { get; set; } 
    public virtual Room Room { get; set; } 

    // Added for convenience 
    public virtual ICollection<Booking> Bookings { get; set; } 
} 

Room.cs

public class Room 
{ 
    [Key] 
    public int RoomId { get; set; } 

    public string RoomName { get; set; } 

    public Gender RoomGender { get; set; } 

    public RoomStatus RoomStatus { get; set; } 

    public virtual ICollection<Bunk> Bunks { get; set; } 

    // Added for convenience 
    public virtual ICollection<Booking> Bookings { get; set; } 

} 

Bookings.cs

public class Booking 
{ 
    [Key] 
    public int BookingId { get; set; } 

    //[ForeignKey("UserProfile")] 
    //public int UserProfileId { get; set; } 
    //public UserProfile UserProfile { get; set; } 

    [ForeignKey("Bunk")] 
    public int BunkId { get; set; } 
    public Bunk Bunk { get; set; } 

    public int Duration { get; set; } 

    [ForeignKey("Preferred_Room")] 
    public int RoomId { get; set; } 
    public Room Preferred_Room { get; set; } 

    public Decimal Price { get; set; } 

    public BookingStatus BookingStatus { get; set; } 
} 

Что бы лучшая работа вокруг будет удалить эту проблему, не вызывая слишком много помех к исходной структуре класса , Я не слишком беспокоюсь о добавлении новых таблиц объединения, пока я все еще могу получить доступ к коду в режиме Lazy загрузки в моделях моих контроллеров/представлений.

ответ

0

вы можете попробовать указать Fluent API для установки лавины вообще не удалять

public class YOURContext: DbContext{ 

protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
// here is where fluent API goes. 
// I suspected the error is EF wanting a NO cascade delete. Hence the suggestion to try 

entity<Booking>.HasOptional(t => t.Bunk) 
       .WithOptionalPrincipal() 
       .WillCascadeOnDelete(false);  // <<<<<< this is the option to try. 

// you may also need to try the same with Preferred_Room as well. 
+0

Извините, я не уверен, куда это пойдет, будет ли это проходить в моем классе DatabaseContext, который наследуется от 'DbContext'? - Я очень новичок в ASP MVC, и я делаю этот проект для университетского модуля, к сожалению, мои истории в других технологиях :( –

+0

Если так, мой класс «DatabaseContext» содержит только «public DbSet Rooms {get; set;} public DbSet Bunks {get; set;} Публичный DbSet Заказы {get; set;} 'и я все еще немного смущен, как бы это связано с этим? –

+0

Также я должен указать: если бронирование, комната или койка удаляется. Я не хочу, чтобы любые другие объекты были удалены вместе с ними, они просто будут перераспределены в другой объект. –

0

Если нет каскадного удаления не требуется, то в контексте базы данных класса можно установить каскадное удаление ложь для всех отношений пути переопределения OnModelCreating метод, нижеприведенный. По умолчанию EF делает его каскадным удалением, поэтому вы получаете исключение циклов или нескольких путей удаления.

public class MyContext: DbContext 
{ 
    //db sets defined 


    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder);    

     modelBuilder.Entity<PrimaryKeyTable>().HasMany(x => x.ChildTableCollection).WithRequired(x => 
     Key).WillCascadeOnDelete(false); 

     //In your case 

     modelBuilder.Entity<Bunk>().HasMany(x => x.Bookings).WithRequired(x => 
     x.BunkId).WillCascadeOnDelete(false); 

     // same for room if required. 
    } 
} 
Смежные вопросы