EF 4.1 Code First ModelBuilder HasForeignKey для отношений «один к одному»

Очень просто я сначала использую код 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 (.. )], но в построителе модели. Или это случай, когда это плохая практика и ее явно не учитывали?

5
задан Walter 14 July 2012 в 00:52
поделиться