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 の複合主キーになる可能性がありますが、そうではありません。

この偽の外部キー関係を介して AB がナビゲーション プロパティであることを Fluent API で表現することは可能ですか?

動作しないことを除いて、次のようなものです。

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

1 に答える 1

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 });
    }
}
于 2012-08-16T14:34:40.367 に答える