2015-05-09 5 views
2

Я определяю много классов в своем проекте и как требование аудита, каждый объект в моем проекте должен иметь внешние ключи для «AspNetUser», таблицы, указав пользователя, который создал запись, и один для пользователя, который его обновил. Ниже приведен пример «Клиент» лица, однако, как я уже сказал, что есть тонны лиц, все с тем же требованием:«Цикл или несколько каскадных путей» в связи с моделью «ApplicationUser»

public class Customer { 

    public int Id {get; set;} 

    // bunch of properties 

    [Required] 
    public string CreateUserId {get; set;} 
    [Required] 
    public string UpdateUserId {get; set;} 

    [ForeignKey("CreateUserId")] 
    public virtual ApplicationUser CreateUser {get; set;} 
    [ForeignKey("UpdateUserId")] 
    public virtual ApplicationUser UpdateUser {get; set;} 
} 

Теперь, потому что есть два внешних ключей к таблице AspNetUser, когда я хочу создать миграцию и обновить базу данных, я получаю хорошую старую ошибку:

Вводя ограничение внешнего ключа «FK_dbo.Customers_dbo.AspNetUsers_UpdateUserId» на стол «Клиенты» может вызвать циклы или несколько путей порогов. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY. Не удалось создать ограничение. См. Предыдущие ошибки.

Я также понимаю, что добавив некоторые коды в «OnModelCreate» и удалив эффект каскада для объекта «Клиент», я смогу обойти это, однако, как я уже сказал, каждый объект в моем приложении будет иметь эти две ссылки на таблицу AspNetUser, что означает, что я должен каждый раз добавлять этот кусок кода в OnModelCreate каждый раз с конкретной сущностью, о которой я говорю.

Кроме того, я не хочу отменять эффект CASCADE DELETE в целом, так как он влияет на функциональность приложения во всех частях. Любая идея, как я могу эффективно обойти это?

Помню, в дни, когда я программировал базу данных, никогда не возникало проблем с одним объектом, имеющим два внешних ключа к другому.

+0

Что касается UpdateUser - Удалить это поле и создать журнал для обновлений, потому что, если два пользователя обновления записи вы будете иметь только последний , Что делает историю отслеживания в этом одиночном целочисленном поле бесполезным. У меня есть те же требования и перешел в журнал истории, а не во второй столбец из-за последнего аргумента. –

ответ

1

вы должны установить WillCascadeOnDelete = False на fluentApi, например:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
      modelBuilder.Entity<Customer >() 
       .HasRequired(c => c.CreateUser) 
       //.WithMany() 
       .HasForeignKey(c => c.CreateUserId) 
       .WillCascadeOnDelete(false); 

      modelBuilder.Entity<Customer>() 
       .HasRequired(c => c.UpdateUser) 
       //.WithMany() 
       .HasForeignKey(c => c.UpdateUserId) 
       .WillCascadeOnDelete(false); 
}