#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: я удалил ненужный код, сохранив только внешние ключи и т.д.