Проблема с отображением отношения один ко многим с помощью EF CTP4

Я пытаюсь определить отношение «один ко многим» между категорией и проектом (категория может иметь один или несколько проектов, проект может иметь одну категорию или не иметь ее)

public class Project : Entity {

    public virtual string Title { get; set; }

    public virtual Guid? CategoryId { get; set; }
    public virtual Category Category { get; set; }
}

public class Category : Entity {       
    public virtual string Name { get; set; }
    public virtual ICollection<Project> Projects { get; set; }
}

Я определил следующие сопоставления:

            modelBuilder.Entity<Project>()
            .MapSingleType(p => new {
                ProjectId = p.Id,
                p.CategoryId,
                p.Title,
                p.Slug,
                p.ShortDescription,
                p.Description,
                p.CreatedOn,
                p.UpdatedOn
            })
            .ToTable("Projects");

        modelBuilder.Entity<Category>()
            .MapSingleType(c => new {
                CategoryId = c.Id,
                c.Name,
                c.CreatedOn,
                c.UpdatedOn
            })
            .ToTable("Categories");

        // relationships
        modelBuilder.Entity<Project>()
            .HasOptional<Category>(p => p.Category)
            .WithMany()
            .HasConstraint((p, c) => p.CategoryId == c.Id);

Теперь, хотя это работает нормально, EF по-прежнему создает таблицу Categories_Products (используется для многих ко многим ассоциациям).

Я отключил инициализатор базы данных по умолчанию, но эта таблица все еще создается. Что я делаю неправильно?

Спасибо Бен


person Ben Foster    schedule 15.11.2010    source источник


Ответы (1)


Я удалил код сопоставления проектов и категорий и позволил EF использовать соглашения по умолчанию для создания базы данных. Это создало отношения, которые я ожидал (один ко многим между категорией и проектом).

Я бы добавил, что единственная причина, по которой я явно определял сопоставление, заключалась в том, что EF не очень хорошо обрабатывает базовые классы. У меня был базовый класс «Сущность» с одним свойством «Идентификатор», от которого унаследованы все мои сущности. Это вызвало столько проблем с CTP4, что я просто заменил его интерфейсом IEntity. Это по-прежнему давало мне ограничения, необходимые мне при работе с общими классами репозитория.

Надеемся, что базовые классы сущностей будут лучше поддерживаться в RTM.

person Ben Foster    schedule 16.11.2010