代码之家  ›  专栏  ›  技术社区  ›  superlogical

实体框架。。如何映射自引用外键。。类别有很多类别

  •  3
  • superlogical  · 技术社区  · 14 年前

    我有以下poco课程:

    public class Category : IDisplayName
    {
        private ICollection<Category> children;
        private Category parent;
    
        public Category()
        {
            children = new List<Category>();
        }
    
        public int Id { get; set; }
    
        public string Name { get; set; }
    
        public virtual Category Parent
        {
            get { return parent; }
            set
            {
                parent = value;
    
                // if (value != null && parent.Children.Contains(this) == false)
                // {
                //      parent.Children.Add(this);
                // }
            }
        }
    
        public virtual ICollection<Category> Children
        {
            get { return children; }
            set { children = value; }
        }
    }
    

    这是映射文件(我不确定这是否正确。。但是我没有主意了,而且所有的文件都有问题……)

    public class CategoryEntityConfiguration : EntityConfiguration<Category>
    {
        public CategoryEntityConfiguration()
        {
            Property(x => x.Name).IsRequired();
    
            HasMany(x => x.Children).WithOptional(x => x.Parent);
            HasOptional(x => x.Parent).WithMany(x => x.Children);
        }
    }
    

    注意“Parent”属性以及我如何不使用“Children”集合添加它们。

    var cat_0 = new Category { Name = "Root" };            
    var cat_1 = new Category { Name = "Property", Parent = cat_0 };
    var cat_2 = new Category { Name = "Property Services", Parent = cat_1 };
    var cat_3 = new Category { Name = "Housing Association", Parent = cat_2 };
    var cat_4 = new Category { Name = "Mortgages & Conveyancing", Parent = cat_2 };
    var cat_5 = new Category { Name = "Property Management", Parent = cat_2 };
    var cat_6 = new Category { Name = "Property Auctions", Parent = cat_2 };
    var cat_7 = new Category { Name = "Landlords Wanted", Parent = cat_2 };
    
    context.Set<Category>().Add(cat_0);
    

    任何帮助都将不胜感激

    满意的

    1 回复  |  直到 14 年前
        1
  •  2
  •   Ladislav Mrnka    14 年前

    这是可能的,但你必须使用跟踪代理。为此,请修改Category类,以便 持久化属性是虚拟的。

    public class Category 
    { 
        public virtual int Id { get; set; } 
        public virtual string Name { get; set; } 
        public virtual Category Parent { get; set; }
        public virtual ICollection<Category> Children { get; set; } 
    } 
    

    using (var context = new ObjectContext(connectionString))
    {
      // This should be default value
      context.ContextOptions.ProxyCreationEnabled = true;
    
      var cat0 = context.CreateObject<Category>();
      cat0.Name = "A";
    
      var cat1 = context.CreateObject<Category>();
      cat1.Name = "B";
      cat1.Parent = cat0;
    
      context.CreateObjectSet<Category>().AddObject(cat0);
      context.SaveChanges(); 
    }
    

    编辑:

    如果您不喜欢跟踪代理(需要现有上下文)的方法,您可以反转创建实体的方式。不必在childs上设置Parent属性,而必须在Parent上填充childs。那样的话就行了。