Сопоставление свойств с полями внешнего ключа (с разными именами) в Entity Framework CTP5 - PullRequest
3 голосов
/ 09 декабря 2010

Я пытаюсь использовать 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 в таблице магазинов.

Я пытаюсь сопоставить 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");

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

Как мне указать это отображение?

Ответы [ 3 ]

9 голосов
/ 11 декабря 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");
    });

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

2 голосов
/ 09 декабря 2010

Я думаю, что лучший способ решить эту проблему - это превратить вашу независимую ассоциацию в Ассоциацию внешних ключей , то есть вместо того, чтобы скрывать внешний ключ 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

0 голосов
/ 09 декабря 2010

Я думаю, что вы ищете, это атрибут RelatedTo. Больше информации в этом блоге команды ADO.NET .

...