Problem mapping one to many relationship with EF CTP4
-
10-10-2019 - |
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
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