使用 fluent 为实体框架 4.1 设置递归映射

Posted

技术标签:

【中文标题】使用 fluent 为实体框架 4.1 设置递归映射【英文标题】:Setting up a recursive mapping with fluent for Entity Framework 4.1 【发布时间】:2011-06-26 06:43:06 【问题描述】:

如何为这种类型设置流利的映射?

public class Topic

    public int Id  get; set;     
    public string Title  get; set;     
    public virtual ICollection<Topic> Children  get; set;     
    public int ParentId  get; set;     
    public Topic Parent  get; set;     
    public virtual ICollection<Topic> Related  get; set; 

【问题讨论】:

【参考方案1】:

我假设 ParentId 不是必需的,因为并非每个主题都有父级。

public class Topic

    public int Id  get; set; 
    public string Title  get; set; 
    public int? ParentId  get; set; 
    public Topic Parent  get; set; 
    public virtual ICollection<Topic> Children  get; set; 
    public virtual ICollection<Topic> Related  get; set; 

那么映射看起来类似于

public class TopicMap : EntityTypeConfiguration<Topic>

    public TopicMap()
    
        HasKey(t => t.Id);

        Property(t => t.Title)
            .IsRequired()
            .HasMaxLength(42);

        ToTable("Topic");
        Property(t => t.Id).HasColumnName("Id");
        Property(t => t.Title).HasColumnName("Title");
        Property(t => t.ParentId).HasColumnName("ParentId");

        // Relationships
        HasOptional(t => t.Parent)
            .WithMany()
            .HasForeignKey(d => d.ParentId);
        //Topic might have a parent, where if it does, has a foreign key
        //relationship to ParentId
    

以及模型绑定插件:

protected override void OnModelCreating(DbModelBuilder modelBuilder)

    modelBuilder.Configurations.Add(new TopicMap());
    //modelBuilder.Configurations.Add(new TopicChildrenMap()); ..etc
    //modelBuilder.Configurations.Add(new TopicRelatedMap());  ..etc

我还建议您联系the EF Power Tools CTP。这对于学习和理解如何创建流畅的配置非常有帮助。

希望对您有所帮助。

【讨论】:

我这个简单的添加 HasOptional(p => p.Parent) 就足够了。否则,WithMany 会导致主题在不应该出现时显示为子主题和相关主题。 可以做到以级联方式删除孩子吗?自动设置父级怎么样? 谢谢,这也回答了我的问题。不过,我想知道“Children”和“Parent”属性名称是否是语言的必需约定,或者它们的名称是否可以更改。

以上是关于使用 fluent 为实体框架 4.1 设置递归映射的主要内容,如果未能解决你的问题,请参考以下文章

EF 6.X 中的实体框架代码优先 Fluent API 默认值

Fluent NHibernate 自动映射:一对多实体,多对多后端?

EF 4.1:使用 Fluent 映射从 Code First 中查找关键属性类型

使用实体框架 Fluent Api 映射 System.Uri

我是不是需要使用 Fluent API 配置与实体框架的关系的双方?

实体框架代码优先 - Fluent Api 与数据注释的优缺点 [关闭]