实体框架编辑多对多表

时间:2014-06-26 13:41:31

标签: 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不保存记录。

3 个答案:

答案 0 :(得分: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(); 
}

请注意,对已经跟踪的实体调用“添加”或“附加”也可用于更改实体状态。例如,为当前处于已添加状态的实体调用Attach将其状态更改为Unchanged。

从这里开始:http://msdn.microsoft.com/en-us/data/jj592676.aspx非常好地解释发生了什么

答案 1 :(得分:2)

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

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

当然保存您的更改。

答案 2 :(得分:0)

您似乎没有对附加的记录进行任何实际修改。我怀疑为了编写任何内容,你要么必须在"添加" state(会导致插入),或者#34; Modified"记录需要进行一些实际修改,原始值必须引用要修改的现有记录。但是,通常在处理链接表时,您永远不会修改值。您只需添加或删除链接记录。