EF Code First假外键

时间:2012-08-16 14:04:04

标签: entity-framework foreign-keys

假设我们有这个

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中保证X和Y对是唯一的,因此{X,Y}可以是B上的复合主键,但不是,Id是。

使用Fluent API可以通过这种伪造的外键关系表达A.B应该是导航属性吗?

这样的东西,除了它不起作用:

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

1 个答案:

答案 0 :(得分: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 });
    }
}