假设我们有这个
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 })
答案 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 });
}
}