Очень просто я сначала использую код Entity Framework 4.1, и вместо этого я хотел бы заменить свои атрибуты [ForeignKey (.. )] на плавные вызовы modelBuilder. Что-то похожее на WithRequired (... )и HasForeignKey (... ), ниже которого связывается явное свойство внешнего ключа (CreatedBySessionId )вместе со связанным свойством навигации (CreatedBySession ).. Но я хотел бы сделать это для отношений один к одному, а не один ко многим:
modelBuilder.Entity<..>().HasMany(..).WithRequired(x => x.CreatedBySession).HasForeignKey(x => x.CreatedBySessionId)
Ниже приведен более конкретный пример. Это вполне успешно работает с [ForeignKey (..)], но я хотел бы избавиться от него и настроить его исключительно в построителе моделей.
public class VendorApplication
{
public int VendorApplicationId { get; set; }
public int CreatedBySessionId { get; set; }
public virtual Session CreatedBySession { get; set; }
}
public class Session
{
public int SessionId { get; set; }
[ForeignKey("CurrentApplication")]
public int? CurrentApplicationId { get; set; }
public virtual VendorApplication CurrentApplication { get; set; }
public virtual ICollection<VendorApplication> Applications { get; set; }
}
public class MyDataContext: DbContext
{
public IDbSet<VendorApplication> Applications { get; set; }
public IDbSet<Session> Sessions { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Session>().HasMany(x => x.Applications).WithRequired(x => x.CreatedBySession).HasForeignKey(x => x.CreatedBySessionId).WillCascadeOnDelete(false);
// Note: We have to turn off Cascade delete on Session <-> VendorApplication relationship so that SQL doesn't complain about cyclic cascading deletes
}
}
Здесь Session может быть ответственным за создание многих VendorApplications (Session.Applications ), но Session одновременно работает не более чем с одним VendorApplication (Session.CurrentApplication ). Я хотел бы связать свойство CurrentApplicationId со свойством навигации CurrentApplication в modelBuilder, а не через атрибут [ForeignKey (... )].
Что я пробовал
При удалении атрибута [ForeignKey (... )] свойство CurrentApplication создает в базе данных столбец CurrentApplication _VendorApplicationId, который не привязан к столбцу CurrentApplicationId.
Я попытался явно сопоставить отношения, используя имя столбца CurrentApplicationId, как показано ниже, но, очевидно, это приводит к ошибке, поскольку имя столбца базы данных «CurrentApplicationId» уже используется свойством Session.CurrentApplicationId :
modelBuilder.Entity<Session>().HasOptional(x => x.CurrentApplication).WithOptionalDependent().Map(config => config.MapKey("CurrentApplicationId"));
. Такое ощущение, что я упускаю здесь что-то очень очевидное, поскольку все, что я хочу сделать, это выполнить ту же операцию, что и [ForeignKey (.. )], но в построителе модели. Или это случай, когда это плохая практика и ее явно не учитывали?