2013-05-21 125 views
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外键(即也主键)。我的问题对象有一个产品列表。当我更新的产品ID外键并调用“的SaveChanges”对db不生成查询/更新背景:

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

我看了InteliTrace检查查询,但没有查询叫过我QuestionProduct表,即使我的QuestionProduct对象已更改。为什么表格没有更新?没有错误被抛出。

回答

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实体,并且可以直接从QuestionProduct引用收藏集,反之亦然,无需浏览中间实体。

它显示here例如它是如何工作的。