Сначала циклическая ошибка ссылки в коде EF

#c# #entity-framework-4.1 #ef-code-first

#c# #entity-framework-4.1 #ef-code-first

Вопрос:

Это мой абстрактный базовый класс:

 public abstract class ServiceStation
    {
        #region '----- Member(s) -----'

        public int Id { get; set; }

        public int CompanyId { get; set; }

        [ForeignKey("CompanyId")]
        public virtual Company Company { get; set; }

        public int GasolineBrandId { get; set; }

        [ForeignKey("GasolineBrandId")]
        public virtual GasolineBrand GasolineBrand { get; set; }

        [ForeignKey("LastUpdatedByUserId")]
        public virtual User LastUpdatedBy { get; set; }

        public int LastUpdatedByUserId { get; set; }

        [ForeignKey("CreatedByUserId")]
        public virtual User CreatedBy { get; set; }

        public int CreatedByUserId { get; set; }

        #endregion
    }
  

Я унаследовал этот класс в CompanyStation:

 public class CompanyStation : ServiceStation
    {
        #region '----- Member(s) -----'

        [InverseProperty("CompanyStation")]
        public virtual SapphirePosSystem SapphirePosSystem { get; set; }

        [ForeignKey("StoreManagerId")]
        public virtual User StoreManager { get; set; }

        public int StoreManagerId { get; set; }

        [ForeignKey("OfficeManagerId")]
        public virtual User OfficeManager { get; set; }

        public int OfficeManagerId { get; set; }

        #endregion
    }
  

Когда я это делаю, я продолжаю получать ошибку циклической ошибки внешнего ключа для StoreManager. Если я удалю это свойство, я получу сообщение об ошибке для OfficeManager. Аналогично, если я удалю это, я получу ошибку для CreatedBy и так далее. Все внешние ключи выдают такую циклическую ошибку ссылки. У меня нет двунаправленной связи. Не знаю, почему Code First считает его циклическим. Методом проб и ошибок я обнаружил, что если я помещу этот фрагмент кода в свою EntityConfiguration, он будет работать нормально:

 public class CompanyStationConfiguration : EntityTypeConfiguration<CompanyStation>
    {
        #region '----- Methods -----'

        public CompanyStationConfiguration()
            : base()
        {
            HasRequired(e => e.StoreManager).
                    WithMany().
                        HasForeignKey(e => e.StoreManagerId).
                            WillCascadeOnDelete(false);

            HasRequired(e => e.OfficeManager).
                   WithMany().
                       HasForeignKey(e => e.OfficeManagerId).
                           WillCascadeOnDelete(false);

            HasRequired(e => e.Company).
                   WithMany().
                       HasForeignKey(e => e.CompanyId).
                           WillCascadeOnDelete(false);

            HasRequired(e => e.LastUpdatedBy).
                WithMany().
                    HasForeignKey(e => e.LastUpdatedByUserId).
                        WillCascadeOnDelete(false);

            HasRequired(e => e.CreatedBy).
            WithMany().
                HasForeignKey(e => e.CreatedByUserId).
                    WillCascadeOnDelete(false);

            Map(e => { e.MapInheritedProperties(); e.ToTable("CompanyStations"); });
        }
  

Кто-нибудь может сказать мне, почему это происходит, и правильно ли я решил проблему, или это небольшая работа с исправлениями?

Заранее спасибо 🙂

Комментарии:

1. У вас есть циклическая ссылка? Есть ли User ссылка на ServiceStation или CompanyStation ? (Также я рекомендую вам урезать свой вопрос — у вас там много нерелевантного кода)

2. @Kirk Broadhurst: Нет, у меня нет. Это то, что меня удивляет. Хорошо, конечно. Я урежу код.

3. @Kirk: я удалил ненужный код, сохранив только внешние ключи и т.д.