2

私は注文支払いの1対多の関係を持っています:

public class Order
{
    [Key]
    public Guid SerialNumber { get; set; }

    public string OrderNumber { get; set; }

    ...

    [ForeignKey("OrderNumber")]
    public virtual ICollection<Payment> Payments { get; set; }
}

public class Payment
{
    [Key]
    public string SerialNumber { get; set; }

    public string OrderNumber { get; set; }

    ...

    public decimal Amount { get; set; }
}

利用可能なレコードにもかかわらず、Paymentsコレクションには常に0個の要素が表示されます。トレースを確認しましたが、問題は生成されたSQLクエリにあるようです。Order.SerialNumberをPayment.OrderNumberに一致させようとしています。

できればデータ注釈を使用して、これをどのように解決できますか?前もって感謝します!

4

1 に答える 1

1

Order.SerialNumberをPayment.OrderNumberに一致させようとしています。

はい、それはまさにあなたがモデル化したものだからです。ForeignKey属性は、関連するテーブルの外部キープロパティの名前を記述していません。同じテーブル内の外部キープロパティの名前を記述し、ナビゲーションプロパティをそのキーとペアにするために使用されるため、正しい使用法は次のとおりです。

public class Order
{
    [Key]
    public Guid SerialNumber { get; set; }

    public string OrderNumber { get; set; }

    ...

    public virtual ICollection<Payment> Payments { get; set; }
}

public class Payment
{
    [Key]
    public string SerialNumber { get; set; }

    // Foreign key must have the same type as primary key in the principal table
    public Guid OrderNumber { get; set; }

    ...

    public decimal Amount { get; set; }

    // Reverse navigation property to principal associated with foreign key
    [ForeignKey("OrderNumber")]
    public virtual Order Order { get; set; }
}

Paymentにナビゲーションプロパティが必要ない場合は、FluentAPIを使用してマッピングを記述する必要があります。

modelBuilder.Entity<Order>()
            .HasMany(o => o.Payments)
            .WithRequired()
            .HasForeignKey(p => p.OrderNumber);

OrderNumber既存のデータベースがあり、リレーションが実際にテーブルの列をターゲットにしてOrderいる場合は、一意の制約でマークする必要があることを意味します。このようなリレーションは、一意の制約をまだサポートしていないため、現在EFでマッピングできません。

于 2012-09-18T18:40:46.510 に答える