Question

I am trying to define a one to many relationship between Category and Project (a Category can have one or many Projects, a Project can have one or no Category)

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

I have defined the following mappings:

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

Now although this appears to be working fine, EF is still generating a Categories_Products table (used for many to many associations).

I've disabled the default database initializer yet this table is still being generated. What am I doing wrong?

Thanks Ben

Was it helpful?

Solution

I removed the project and category mapping code and let EF use default conventions to create the database. This created the relationship I expected (one to many between category and project).

I would add that the only reason that I was explicitly defining the mapping was because EF does not appear to handle base classes very well. I had a base class "Entity" with a single property "Id" that all my entities inherited from. This caused so many problems with CTP4 that I just swapped it with an interface IEntity. This still gave me the constraints I needed when working with generic repository classes.

Hopefully entity base classes will be better supported in the RTM

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top