我有以下对象模型:
[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表调用查询。为什么表没有更新?没有错误。
答案 0 :(得分:1)
您的实体QuestionProduct
仅包含关键属性,没有其他标量属性。实体框架不允许更改(主要)密钥属性。
您必须删除旧的链接记录并创建一个新记录才能建立新的关系,例如:
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
实体,并且可以将集合直接从Question
引用到Product
,反之亦然,而无需浏览中间实体。
显示here例如它是如何工作的。