2013-05-21 2 views
0

У меня есть следующая объектная модель:Entity Framework запрос не генерируются

[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 

так что таблица имеет только за два внешние ключи (которые также являются первичными ключами). У моего объекта вопроса есть список продуктов. Когда я обновить внешний ключ ProductID и называют «SaveChanges» на контексте не запрос/обновление не генерируется в дб:

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

я смотрел в InteliTrace проверить запрос, но ни один из запросов не вызывается над моим QuestionProduct столом, даже если меняет объект QuestionProduct. Почему таблица не обновляется? Ошибка не возникает.

ответ

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 и можете иметь коллекции, напрямую ссылающиеся от Question на Product и наоборот, без необходимости перемещаться по промежуточной сущности.

Отображается here, например, как это работает.

Смежные вопросы