Entity-Framework Редактирование таблицы «многие ко многим»

#c# #entity-framework

#c# #entity-framework

Вопрос:

Я разрабатываю приложение, которое будет таблицей для отслеживания транспортировки.

У меня есть четыре таблицы:

 CREATE TABLE [dbo].[Trips]
(
    [TripID] INT NOT NULL PRIMARY KEY IDENTITY,
    ...
)
CREATE TABLE [dbo].[Drivers]
(
    [DriverID] INT NOT NULL PRIMARY KEY IDENTITY,
    ...
)
CREATE TABLE [dbo].[Vehicles]
(
    [VehicleID] INT NOT NULL PRIMARY KEY IDENTITY,
    ...
)
And one table called VehicleTrip 
CREATE TABLE [dbo].[VehicleTrip]
(
    [TripID] INT NOT NULL , 
    [VehicleID] INT NOT NULL, 
    [DriverID] INT NOT NULL, 
    PRIMARY KEY ([TripID], [VehicleID], [DriverID]), 
    CONSTRAINT [FK_TripIDs_Trips] FOREIGN KEY (TripID) REFERENCES Trips(TripID), 
    CONSTRAINT [FK_VechicleID_Vehicles] FOREIGN KEY (VehicleID) REFERENCES Vehicles(VehicleID), 
    CONSTRAINT [FK_DriverID_DriverID] FOREIGN KEY (DriverID) REFERENCES Drivers(DriverID)
)
  

Используя EF, я пытаюсь отредактировать запись в VehicleTrip

 public class TripVM
{
    public int TripID { get; set; }
    public int VehicleID { get; set; }
    public int DriverID { get; set; }
    //Other fields

public void InsertUpdate()
{
    var vehicletrip = new StudentTransportation.Data.Model.VehicleTrip
        {
            //Uses the classes values to create the new object
            TripID = TripID,
            VehicleID = VehicleID,
            DriverID = VehicleID
        };

    context.VehicleTrip.Attach(vehicletrip);
    context.Entry(vehicletrip).State = EntityState.Modified;
    context.SaveChanges();
}
  

Однако, похоже, что EF не сохраняет запись.

Ответ №1:

Одним из вариантов будет извлечение исходного объекта (того, который вы пытаетесь обновить), затем создание нового объекта с новыми значениями и обновление с помощью следующего кода:

 context.Entry(originalEntity).CurrentValues.SetValues(newEntityWithNewValues);
  

и, конечно, сохраните ваши изменения.

Ответ №2:

Вы можете изменить состояние объекта, который уже отслеживается, установив свойство State для его записи. Например:

 var existingBlog = new Blog { BlogId = 1, Name = "ADO.NET Blog" }; 

using (var context = new BloggingContext()) 
{ 
    context.Blogs.Attach(existingBlog); 
    context.Entry(existingBlog).State = EntityState.Unchanged; 

    // Do some more work...  

    context.SaveChanges(); 
}
  

Обратите внимание, что вызов Add или Attach для объекта, который уже отслеживается, также может использоваться для изменения состояния объекта. Например, вызов Attach для объекта, который в данный момент находится в состоянии Added, изменит его состояние на неизмененное.

взял это отсюда: http://msdn.microsoft.com/en-us/data/jj592676.aspx действительно хорошее объяснение того, что происходит

Ответ №3:

Похоже, у вас нет каких-либо фактических изменений в прикрепленной вами записи. Я подозреваю, что для того, чтобы что-либо было написано, вам либо нужно иметь объект в состоянии «Добавлено» (что приведет к вставке), либо «Измененная» запись должна иметь некоторые фактические изменения, а исходные значения должны ссылаться на существующую запись, которая будет изменена. Однако, как правило, при работе со ссылочными таблицами вы никогда не изменяете значения. Вы просто добавляете или удаляете записи ссылок.