2010-11-15 91 views
1

我试图定义一个类和项目之间的多对多关系(一个类别可以有一个或多个项目,一个项目可以有一个或无甲类)问题映射一个与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表(用于多对多关联)。

我已经禁用了默认的数据库初始值设定项,但此表仍在生成。我究竟做错了什么?

感谢 本

回答

0

我删除的项目和类别映射代码,让EF使用默认的惯例来创建数据库。这创造了我期望的关系(类别和项目之间的一对多关系)。

我想补充一点,我明确定义映射的唯一原因是因为EF似乎无法很好地处理基类。我有一个基类“实体”与一个单一的财产“Id”,我的所有实体继承。这导致了CTP4的许多问题,我只是将它与接口IEntity进行了交换。这仍然给了我使用通用存储库类时所需的约束。

希望实体基类可以更好地支持RTM