EF FluentAPI 0..1到*映射

bog*_*diu 2 mapping fluent-interface foreign-keys entity-framework-4

如何在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 () {
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

也有可能只有

public Parent Parent{ get; set; } 
Run Code Online (Sandbox Code Playgroud)

代替

public Parent Parent_Object{ get; set; } 
public int Parent{ get; set; } 
Run Code Online (Sandbox Code Playgroud)

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

Dev*_*art 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; }
  }
Run Code Online (Sandbox Code Playgroud)

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

public int? ParentId { get; set; }  
Run Code Online (Sandbox Code Playgroud)

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