0

次のオブジェクト モデルがあります。

[Table("APA_QuestionProduct")]
public class QuestionProduct
{
    [Key, ForeignKey("Question"), Column(Order=0)]
    public int QuestionID { get; set; }
    [ForeignKey("QuestionID")]
    public Question Question { get; set; }

    [Key, ForeignKey("Product"), Column(Order=1)]
    public int ProductID { get; set; }
    [ForeignKey("ProductID")]
    public Product Product { get; set; }
}

テーブル:

    USE [qbm]
GO

/****** Object:  Table [dbo].[APA_QuestionProduct]    Script Date: 5/21/2013 6:52:46 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[APA_QuestionProduct](
    [QuestionID] [int] NOT NULL,
    [ProductID] [int] NOT NULL,
 CONSTRAINT [PK_APA_QuestionProduct] PRIMARY KEY CLUSTERED 
(
    [QuestionID] ASC,
    [ProductID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[APA_QuestionProduct]  WITH CHECK ADD  CONSTRAINT [FK_APA_QuestionProduct_APA_Product] FOREIGN KEY([ProductID])
REFERENCES [dbo].[APA_Product] ([ProductID])
GO

ALTER TABLE [dbo].[APA_QuestionProduct] CHECK CONSTRAINT [FK_APA_QuestionProduct_APA_Product]
GO

ALTER TABLE [dbo].[APA_QuestionProduct]  WITH CHECK ADD  CONSTRAINT [FK_APA_QuestionProduct_APA_Question] FOREIGN KEY([QuestionID])
REFERENCES [dbo].[APA_Question] ([QuestionID])
GO

ALTER TABLE [dbo].[APA_QuestionProduct] CHECK CONSTRAINT [FK_APA_QuestionProduct_APA_Question]
GO

そのため、背後のテーブルには 2 つの外部キー (主キーでもあります) しかありません。私の質問オブジェクトには製品のリストがあります。ProductID 外部キーを更新し、コンテキストで 'SaveChanges' を呼び出すと、db でクエリ/更新が生成されません:

question.Products[1].ProductID = 4;                
db.Entry(question.Products[1]).State = EntityState.Modified;
db.SaveChanges();

クエリを確認するために InteliTrace を調べましたが、QuestionProduct オブジェクトが変更されていても、QuestionProduct テーブルに対してクエリが呼び出されません。テーブルが更新されないのはなぜですか? エラーはスローされません。

4

1 に答える 1

1

エンティティQuestionProductにはキー プロパティのみが含まれ、他のスカラー プロパティは含まれません。Entity Framework では、(主) キーのプロパティを変更することはできません。

新しい関係を確立するには、古いリンク レコードを削除し、新しいリンク レコードを作成する必要があります。たとえば、次のようになります。

QuestionProduct oldProduct = question.Products[1];
QuestionProduct newProduct = new QuestionProduct
{
    QuestionID = question.QuestionID,
    ProductID = 4
};

db.QuestionProducts.Attach(oldProduct);
db.QuestionProducts.Remove(oldProduct);
db.QuestionProducts.Add(newProduct);

db.SaveChanges();

ただし、実際にはこれを多対多の関係としてモデル化する必要があります。エンティティは必要なく、中間エンティティをナビゲートすることなく、直接参照するQuestionProductコレクションを持つことができ、その逆も可能です。QuestionProduct

たとえば、どのように機能するかをここに示します。

于 2013-05-21T17:23:32.583 に答える