使用 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