1

LINQ to SQL を使用したオブジェクト リレーショナル マッピングの味を得るためにいくつかのテストを行っていますが、多対多の関係を機能させようとして行き詰まりました。簡単にするために、注文されたProductsのコレクションを所有するOrderクラスがあるとします。LINQ to SQL を使用してこの製品コレクションをマップするにはどうすればよいですか?

[Table(Name = "OrderTable")]
public class Order
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true)]
    public int ID;

    [Column]
    public string Customer;

    [Association(ThisKey = "ID", OtherKey = "ID")] // Not working
    public EntitySet<Product> products = new EntitySet<Product>();
}

[Table(Name = "ProductTable")]
public class Product
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true)]
    public int ID;

    [Column]
    public string Name;

    [Column]
    public double Price;
}

OrderProductsを保持するコンテナとしてEntitySetを使用しようとしましたが、LINQ クエリが空の製品コレクションを持つOrderオブジェクトを返すため、機能しませんでした。

PS: From This question注文と製品の関係を追跡するために 3 番目のクラスを作成する必要があるようですが、別のクラスを作成せずにそれを行う方法を見つけたいと思っていました。

4

2 に答える 2

3

Order-Product テーブル以外のデータベースでこれをモデル化する方法はなく、Linq-to-SQL エンティティは SQL テーブルと一致します。残念ながら、これは (私が知る限り) Linq-to-SQL でこれをモデル化する唯一の方法です。

モデルを作成した後、エンティティを右クリックして [コードの表示] を選択し (DBML デザイナーを想定し、それ以外の場合はコードに追加するだけです)、次のようなものを追加することで、この制限を非表示にするプロパティを作成できます。

public partial class Order
{
    public IEnumerable<Product> Products
    {
        get
        {
            return OrderProducts.Select(op => op.Product);
        }
    }
}
于 2012-05-14T00:48:19.500 に答える
0

@TheEvilPenguinが指摘しているように、

  • LINQ-to-SQLはクラスをテーブルにマップします
  • データベース内のこの多対多の関係を促進するには、OrderProductテーブルが必要です。
  • したがって、LINQ-to-SQLもそのテーブルをマップする必要があります。

その結合テーブルをデザイナにドラッグします。Order名前付きのプロパティがあり、プロパティを介してにOrderProduct移動できるようになりますProductsOrderOrderProducts

foreach (var op in Order.OrderProducts)
{
    var product = op.Product;
}
于 2012-05-14T01:24:29.467 に答える