EF FluentAPI 0..1到*映射

时间:2010-12-24 09:18:31

标签: foreign-keys entity-framework-4 mapping fluent-interface

如何在EF 4.0 FluentAPI CTP5中映射0..1到*关系? 我一直在犯这个错误

  

因为从属角色中的所有属性都是不可为空的,   主要角色的多样性必须为“1”。

我不知道如何解决它......

我的代码看起来像这样

    public class Child{
        public int pID { get; set; }
        public Parent Parent_Object{ get; set; } 
        public int Parent{ get; set; } 

        public Child() {
        }
    }


    public class Parent {
        public int pID { get; set; }
        public List<Child>  Children { get; set; }

        public Parent () {
        }
    }

对于映射代码看起来像这样

modelBuilder.Entity<Child>().HasKey(c=> c.pID);  
modelBuilder.Entity<Parent>().HasKey(c=> c.pID); 
modelBuilder.Entity<Child>().HasOptional(c=> c.Parent_Object)
                            .WithMany(p => p.Children)
                            .HasForeignKey(p => p.Parent);

也可以只有

public Parent Parent{ get; set; } 

而不是

public Parent Parent_Object{ get; set; } 
public int Parent{ get; set; } 

在数据库中,FKfield被命名为“Parent”而不是“ParentpID”。在这种情况下,映射应该如何?

1 个答案:

答案 0 :(得分:9)

你可以简单地从映射中删除外键列,一切都会正常工作:

  public class Child{
    public int pID { get; set; }
    public Parent Parent_Object{ get; set; } 

    public Child() { }
  }


  public class Parent {
    public int pID { get; set; }
    public List  Children { get; set; }

    public Parent () { }
  }

  public class Context : DbContext {

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) {

      modelBuilder.Entity().HasKey(c => c.pID);
      modelBuilder.Entity().HasKey(c => c.pID);  
      modelBuilder.Entity().HasOptional(c => c.Parent_Object).WithMany(p => p.Children);
    }

    public DbSet Parents { get; set; }
    public DbSet Childs { get; set; }
  }

作为替代方案,您可以使用nullable int Parent属性,如下所示:

public int? ParentId { get; set; }  

在这种情况下,您的初始代码也是正确的。