2012-08-16 75 views
1

比方说,我们有这个EF代码第1虚拟外键

class A 
{ 
    [Key] 
    public int Id { get; set; } 
    public string X { get; set; } 
    public string Y { get; set; } 
    public B B; 
} 

class B 
{ 
    [Key] 
    public int Id { get; set; } 
    public string X { get; set; } 
    public string Y { get; set; } 
    public virtual ICollection<A> As { get; set; } 
} 

假设X和Y的对保证是B中唯一的,因此{X,Y}可能是在B中的复合主键但不是,Id是。

Fluent API可以通过这个假外键关系来表达A.B应该是导航属性吗?

这样的事情,但它不工作:

HasRequired(a => a.B).WithMany(b => b.As).HasForeignKey(a => new { a.X, a.Y }) 

回答

0

你说你想“假”的外键,我不知道这意味着你不希望你的数据库,以反映关系。如果是这样,那么你不想流利地表达这一点,你应该在你的业务逻辑中强制执行。如果你确实需要一个真正的外键,那么你需要改变B的主键,然后建立复合外键附件。您的初始班级A中存在拼写错误,您没有将导航属性B作为属性创建。我认为这些并不是你的真实对象,但我能够得到这样的工作是这样的:

public class A 
    { 
     public int Id { get; set; } 
     public string X { get; set; } 
     public string Y { get; set; } 
     public virtual B B { get; set; } 
    } 

public class B 
{ 
    public int Id { get; set; } 
    public string X { get; set; } 
    public string Y { get; set; } 
    public virtual ICollection<A> As { get; set; } 
} 

public class Model : DbContext 
{ 
    public DbSet<A> As { get; set; } 
    public DbSet<B> Bs { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

     modelBuilder.Entity<B>() 
      .HasKey(b => new { b.Id, b.X, b.Y }); 

     modelBuilder.Entity<A>() 
      .HasRequired(a => a.B) 
      .WithMany(b => b.As) 
      .HasForeignKey(a => new { a.Id, a.X, a.Y }); 
    } 
} 
+0

请注意,A和B的真正主键不是合成的。但是我想通过关联的假组合键不包含Id,只包含X和Y.另外,我仍然需要将B上的Id作为真正的主键。这意味着你的HasKey()不能用于我的情况。我只需要一个名为B的导航属性,它通过假复合键{X,Y}与B相关。 – pinkfloydhomer 2012-08-17 07:08:59