Отображение «многие ко многим» не работает - EF 4.1 RC - PullRequest
1 голос
/ 24 марта 2011

ОБНОВЛЕНИЕ: После еще нескольких исследований кажется число моих сопоставлений "многие ко многим" не работает. Ммм ...

Я обновляю проект доступа к данным с EF 4.1 CTP4 до EF 4.1 RC, и у меня возникают проблемы с новой настройкой EntityTypeConfiguration<T>.

В частности, у меня проблема с отношением «многие ко многим». Я получаю исключение Sequence contains no elements, когда пытаюсь получить элемент .First().

Конкретное исключение на самом деле не так интересно. Все, что он говорит, - то, что нет никаких элементов НО Я знаю, что должны быть элементы в коллекции - таким образом, должна быть проблема с моими новыми отображениями.

Вот код, который у меня есть:

Модель продукта

public class Product : DbTable
{
    //Blah

    public virtual ICollection<Tag> Categories { get; set; }

    public Product()
    {
        //Blah
        Categories = new List<Tag>();
    }
}

BaseConfiguration

public class BaseConfiguration<T> : EntityTypeConfiguration<T> where T : DbTable
{
    public BaseConfiguration()
    {
        this.HasKey(x => x.Id);
        this.Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        this.Property(x => x.UpdatedOn);
        this.Property(x => x.CreatedOn);
    }
}

ProductConfiguration

public class ProductConfiguration : BaseConfiguration<Product> 
{
    public ProductConfiguration()
    {
        this.ToTable("Product");

        //Blah

        this.HasMany(x => x.Categories)
            .WithMany()
            .Map(m =>
            {
                m.MapLeftKey("Tag_Id");
                m.MapRightKey("Product_Id");
                m.ToTable("ProductCategory");
            });
    }
}

Предыдущий CTP4 Отображение обработанного!

this.HasMany(x => x.Categories)
    .WithMany()
    .Map("ProductCategory", (p, c) => new { Product_Id = p.Id, Tag_Id = c.Id  });

Кто-нибудь может увидеть что-нибудь, что нуждается в ремонте? Дайте мне знать, если вы хотите, чтобы я предоставил больше кода.

РЕДАКТИРОВАТЬ: больше код

DbTable

public class DbTable : IDbTable
{
    public int Id { get; set; }
    public DateTime UpdatedOn { get; set; }
    public DateTime CreatedOn { get; set; }
}

Tag

public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Slug { get; set; }
    public bool Visible { get; set; }
    public virtual TagType TagType { get; set; }
}

TagConfiguration

public class TagConfiguration : EntityTypeConfiguration<Tag>
{
    public TagConfiguration()
    {
        this.ToTable("Tags");

        this.HasKey(x => x.Id);
        this.Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).HasColumnName("tag_id");
        this.Property(x => x.Name).HasMaxLength(300).HasColumnName("tag_name");
        this.Property(x => x.Slug).HasMaxLength(500).HasColumnName("tag_slug");
        this.Property(x => x.Visible).HasColumnName("tag_visible");
        this.HasRequired(x => x.TagType).WithMany(tt => tt.Tags).Map(m => m.MapKey("tagtype_id"));
    }
}

Да, это устаревшая база данных с соглашениями об именах до Boohai .

Я знаю, что класс Tag должен быть правильно подключен, поскольку Product имеет другое свойство Specialization, которое также сопоставлено с Tag, и загружается правильно. Но обратите внимание, что он отображается в формате один-ко-многим. Так что, похоже, многие-ко-многим с Tag.

Я начну проверять, работают ли какие-нибудь ассоциации «многие ко многим».

Ответы [ 2 ]

1 голос
/ 26 марта 2011

Необходимо указать оба свойства навигации, чтобы сделать сопоставление «многие ко многим».

Попробуйте добавить лямбду в свойстве WithMany, указывающую на продукты:1007 * (скрещивание пальцев ...)

0 голосов
/ 25 марта 2011

Я еще не использовал подход Code-First, но при работе с POCO мне пришлось включить отложенную загрузку, чтобы заставить работать свойства навигации. Это, конечно, сделано специально, но я не знаю, нужно ли вам явно включать это поведение для Code-First.

...