ОБНОВЛЕНИЕ: После еще нескольких исследований кажется число моих сопоставлений "многие ко многим" не работает. Ммм ...
Я обновляю проект доступа к данным с 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
.
Я начну проверять, работают ли какие-нибудь ассоциации «многие ко многим».