C# 实体框架编辑多对多表

C# 实体框架编辑多对多表,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] ( [Veh

我正在设计一个应用程序,将是表,以保持运输跟踪

我有四张桌子:

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似乎没有保存记录。

您似乎没有对附加的记录进行任何实际修改。我怀疑,为了编写任何内容,您必须使实体处于“添加”状态(这将导致插入),或者“修改”记录需要进行一些实际修改,并且原始值必须引用将要修改的现有记录。但是,通常在处理链接表时,从不修改值。您只需添加或删除链接记录。

您似乎对附加的记录没有任何实际修改。我怀疑,为了编写任何内容,您必须使实体处于“添加”状态(这将导致插入),或者“修改”记录需要进行一些实际修改,并且原始值必须引用将要修改的现有记录。但是,通常在处理链接表时,从不修改值。您只需添加或删除链接记录。

您可以通过在其条目上设置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将使其状态更改为Unchanged


从这里开始:非常好地解释了正在发生的事情

您可以通过在条目上设置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将使其状态更改为Unchanged


从这里开始:对于正在发生的事情,一个很好的解释是检索原始实体(您正在尝试更新的实体),然后使用新值创建一个新实体,并使用以下代码进行更新:

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

当然,保存您的更改。

一个选项是检索原始实体(您正在尝试更新的实体),然后使用新值创建一个新实体,并使用以下代码进行更新:

context.Entry(originalEntity).CurrentValues.SetValues(newEntityWithNewValues);
当然,保存您的更改