3

Я пытаюсь использовать API-интерфейс Entity Framework CTP5 Fluent API для сопоставления существующей базы данных. У меня есть следующие классы:Сопоставление свойств (по-разному) полей внешнего ключа в Entity Framework CTP5

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

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

    public virtual Shop Shop 
    { 
     get; 
     set; 
    } 
} 

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

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

Тем не менее, кажется, это работает только с примитивного типа.

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

ответ

2

Я думаю, что лучший способ решить эту проблему было бы обновить независимую ассоциацию быть внешнего ключа Ассоциация что означает, что вместо того, чтобы прятать внешнего ключа ShopId, на самом деле, включая его в Sale классе. Затем вы можете использовать Aannotations Data/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

Я думаю, что вы ищете атрибут RelatedTo. Дополнительная информация в this ADO.NET team blog post.

+1

Атрибут `RelatedTo` объявлен в CTP4 и * удален * в CTP5. Так что это уже не вариант. Благодарю. – 2010-12-09 16:27:45

9

Обновление: Я добавил пересмотренный вариант для версии Release Candidate ФВ 4.1 ниже

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

EF4.1 RC VERSI на:

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"); 
    }); 

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

+0

Желание я мог бы принять два ответа! – dommer 2011-01-06 23:05:26