Я думаю, что, возможно, нашел ошибку в Entity Framework.
Я использую Database First с MVC3.
В моей базе данных есть следующая таблица:
CREATE TABLE [dbo].[InstructionStep](
[instructionID] [uniqueidentifier] NOT NULL,
[step] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[description] [nvarchar](max) NULL,
[recurrence] [numeric](18, 0) NULL,
[parameters] [nvarchar](50) NULL,
[secuence] [numeric](18, 0) NULL,
[time] [nvarchar](50) NULL,
CONSTRAINT [PK_InstructionStep] PRIMARY KEY CLUSTERED
(
[instructionID] ASC,
[step] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY
Я использую linq to EF для сохранения / редактирования информации в этой таблице.Дело в том, что ... столбец "время" НИКОГДА не получает значение.Я трижды проверил, и модель имеет значение для свойства time объекта, но когда я передаю его в EF, оно никогда не попадает в базу данных.Это код, который я использую для создания новой записи:
using (Models.SAIMBehrEntities db = new Models.SAIMBehrEntities())
{
if (step.description != null)
step.description = step.description.ToUpper();
if (step.parameters != null)
step.parameters = step.parameters.ToLower();
db.InstructionSteps.AddObject(step);
db.SaveChanges();
}
Это код, который я использую для редактирования записи:
Models.InstructionStep s = db.InstructionSteps.Where(x => x.instructionID == stepM.instructionID && x.step == stepM.step).FirstOrDefault();
if (s != null)
{
s.parameters = stepM.parameters;
s.description = stepM.description;
s.recurrence = stepM.recurrence;
s.secuence = stepM.secuence;
s.time = stepM.time;
db.SaveChanges();
}
Все остальное сохраняется, кроме «времени»столбецТеперь я запустил sql profiler.Это запрос, сгенерированный методом create:
exec sp_executesql N'insert [dbo].[InstructionStep]([instructionID], [description], [recurrence], [parameters], [secuence])
values (@0, @1, @2, @3, @4)
select [step], [time]
from [dbo].[InstructionStep]
where @@ROWCOUNT > 0 and [instructionID] = @0 and [step] = scope_identity()',N'@0 uniqueidentifier,@1 nvarchar(max) ,@2 decimal(18,0),@3 nvarchar(50),@4 decimal(18,0)',@0='9013B4B0-28FB-4C52-912D-3598A8E13880',@1=N'DEMO DESCRIPTION',@2=1,@3=N'none',@4=1
И это запрос, сгенерированный методом обновления:
exec sp_executesql N'update [dbo].[InstructionStep]
set [description] = @0, [recurrence] = @1, [parameters] = @2, [secuence] = @3
where (([instructionID] = @4) and ([step] = @5))
select [time]
from [dbo].[InstructionStep]
where @@ROWCOUNT > 0 and [instructionID] = @4 and [step] = @5',N'@0 nvarchar(max) ,@1 decimal(18,0),@2 nvarchar(50),@3 decimal(18,2),@4 uniqueidentifier,@5 decimal(18,0)',@0=N'DEMO DESCRIPTION',@1=1,@2=N'none',@3=1.00,@4='9013B4B0-28FB-4C52-912D-3598A8E13880',@5=1386
Итак ... да.Столбец «время» выбирается после обновления / вставки.Зачем?превосходит меня ...
Я пытался изменить имя столбца на "timestep" и работал правильно.
Это нормальное поведение?я просто глупый или это ошибка?
Спасибо!