Сопоставление свойств полям внешнего ключа (с другими именами) в Entity Framework CTP5

Я пытаюсь использовать Entity Framework CTP5 Fluent API для сопоставления существующей базы данных. У меня есть следующие классы:

public class Shop
{
    public long Id
    {
        get;
        set;
    }
}

public class Sale
{
    public long Id
    {
        get;
        set;
    }

    public virtual Shop Shop
    {
        get;
        set;
    }
}

Соответствующие таблицы называются «Магазины» и «Продажи». У Sales есть внешний ключ StoreId, который указывает на поле Id в таблице Stores.

Я изо всех сил пытаюсь сопоставить Sale.Shop.Id с StoreId в таблице. Я не могу изменить его на ShopId, поэтому мне нужно его сопоставить.

В CTP4 я использовал:

modelBuilder.Entity<Sale>().MapSingleType(x =>
    new
    {
        Id = x.Id,
        StoreId = x.Shop.Id
    });

Я пробовал следующее:

modelBuilder.Entity<Sale>().Property(x => x.Shop.Id).HasColumnName("StoreId");

Однако, похоже, это работает только с примитивным типом.

Как указать это сопоставление?


person dommer    schedule 09.12.2010    source источник


Ответы (3)


Я думаю, что лучшим способом решить эту проблему было бы обновить вашу независимую ассоциацию до ассоциации внешнего ключа, что означает, что вместо того, чтобы скрывать внешний ключ ShopId, фактически включить его в Sale класс. Затем вы можете использовать Data Aannotations/Fluent API, чтобы изменить имя столбца в соответствии с существующей схемой:

public class Shop
{
    public long Id { get;set; }
}

public class Sale
{
    public long Id { get; set; }

    [Column(Name="StoreID")]
    public long ShopId { get; set; }

    public virtual Shop Shop { get; set; }
}


Что приводит к желаемой схеме БД: alt text

person Morteza Manavi    schedule 09.12.2010

Обновление: ниже я добавил исправленную версию кандидата на выпуск EF 4.1.

После некоторой охоты я нашел ответ, который работает для меня:

Версия EF4.1 RC:

modelBuilder.Entity<Booking>().HasRequired(b => b.Booker)
    .WithMany(m => m.BookedSlots).Map(p=>{
                    p.MapKey("BookerID");
    });

в твоем случае:

modelBuilder.Entity<Sale>().HasRequired(sale => sale.Shop)
    .WithMany().Map(s=> {
           s.MapKey("StoreId");
    });

Моя версия немного отличается, потому что у меня есть свойства навигации с обеих сторон отношения.

person Mark Adamson    schedule 10.12.2010
comment
Спасибо @PatrickDesjardins, похоже, я удалил использование IsIndependent после вашего комментария. - person Mark Adamson; 26.01.2018

Я думаю, что вы ищете атрибут RelatedTo. Дополнительные сведения см. в эта запись в блоге команды ADO.NET.

person AJ.    schedule 09.12.2010
comment
Атрибут RelatedTo объявлен в CTP4 и удален в CTP5. Так что это уже не вариант. Спасибо. - person Morteza Manavi; 09.12.2010