我正在尝试定义类别和项目之间的一对多关系(一个类别可以有一个或多个项目,一个项目可以有一个或没有类别)
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表(用于多对多关联)。
我已禁用默认数据库初始化程序,但仍在生成此表。我做错了什么?
由于 本
答案 0 :(得分:0)
我删除了项目和类别映射代码,让EF使用默认约定来创建数据库。这创造了我期望的关系(类别和项目之间的一对多)。
我想补充一点,我明确定义映射的唯一原因是因为EF似乎没有很好地处理基类。我有一个基类“实体”,其中包含我所有实体继承的单个属性“Id”。这导致CTP4出现了很多问题,我只是用IEntity接口交换了它。这仍然给了我在使用通用存储库类时所需的约束。
希望在RTM中更好地支持实体基类