EF Code First составное отображение ключей - PullRequest
2 голосов
/ 20 января 2011

Сначала я использую CTP 5 EF 4 и код. Я не получаю отношения многие-многие, работающие с составным ключом с одной стороны.

    modelBuilder.Entity<Item>()                 
           .HasMany(i => i.Categories)  
           .WithMany(o => o.Items)  
           .Map(
           mc =>
           {                  
               mc.ToTable("ItemCategories");  
               mc.MapLeftKey(i => i.Id, "ItemId");  
               mc.MapRightKey(o => o.TemplateID, "TemplateId");  
               mc.MapRightKey(o => o.ItemId, "ItemId");                  
           }
           );

Так что вместо того, чтобы иметь простой ключ для категорий в моей таблице соответствия, у меня есть составной. И одна часть составного ключа также является ключом для типа элемента, которая, кажется, проблема здесь.

Я получаю сообщение об ошибке: «Каждое имя свойства в типе должно быть уникальным. Имя свойства ItemId уже определено».

Как настроить EF для использования составного ключа в этом случае?

Ответы [ 2 ]

2 голосов
/ 20 января 2011

Конечно, вы не можете иметь 2 столбца с одинаковым именем в одной таблице.Это будет работать:

modelBuilder.Entity<Item>()
            .HasMany(i => i.Categories)
            .WithMany(c => c.Items)
            .Map(m =>
            {
                m.MapRightKey(i => i.Id, "ItemId");
                m.MapLeftKey(c => c.ItemId, "ItemId2");
                m.MapLeftKey(c => c.TemplateId, "TemplateId");
            });
0 голосов
/ 25 января 2011
public class Category
{            
    [Key]        
    public string ItemId { get; set; }
    [Key]
    public string TemplateId { get; set; }

    public string Value { get; set; }

    public ICollection<Item> Items { get; set; }
}

public class Item
{       
    public string Id { get; set; }       
    public string Name { get; set; }      

    public ICollection<Category> Categories { get; set; }
}

Таблица отображения ItemCategories не является POCO, но используется для отображения этих 2, как показано.Он имеет идентификатор столбца SQL (собственный первичный ключ) ItemId (таблица FK для элемента и таблица категории) TemplateId (таблица FK для таблицы категории)

и другой столбец идентификатора, который сопоставляется с другой таблицей.

По моему мнению, единственное отличие здесь от «нормального» сценария «многие-многие» - это составной ключ в таблице ItemCategories, который строит связь с таблицей Category.

...