2011-08-01 121 views
1

我有一个方法在datalibrary看起来像这样的LINQ to SQL更新对象

public IEnumerable<GeneralContractLine> getContractLines(int GeneralContractID) 
{ 
    return db.GeneralContractLines.Where(l => l.FKGeneralContractID == GeneralContractID); 
} 

public void UpdateContractLine(GeneralContractLine line) 
{ 
    //Update the object "line" 
} 

第一种方法是确定的,该数据库仅仅是被更早initiliazied DataContext对象。

我想这样做

更新方法:

db.GeneralContractLine.update(line); 
db.submitChanges(); 

我知道我能找到的对象,然后替换它更新,但有什么更好的办法?

回答

0

我可以预测,您使用db对象来获取代码中某处的GeneralContractLine对象,并对其属性进行一些更改,并且希望保存这些更新,以便我的解决方案仅使用db.submitChanges( )并且在GeneralContractLine对象上完成的所有更改都将被保存。

+0

取决于常规合同行如何更改,通常与asp.net项目从数据上下文断开连接,因此它不会保存提交更改 – Manatherin

+0

发生这种情况在一个不同的项目。所以我不认为我可以更新这个项目。我正试图在分隔项目中实现某种存储库模式。 – espenk

0

使用Linq to SQL,只需更改对象,然后在完成后调用SubmitChanges。

public void UpdateContractLine(GeneralContractLine line) 
{ 
    //Update the object "line" 
    line.PropertyX = "Foo"; 
    db.SubmitChanges(); 
} 
+0

我不想更改某些属性,而是更新/替换它。此代码位于dataAccess库中,并且对该方法的调用可能来自不同的前端系统。因此,当涉及到这个存储库类时,属性的更改已经完成。 – espenk

+0

在这种情况下,只需调用db.SubmitChanges()。 – Nathan

0

你可以做的是为GeneralContractLine的Table类创建一个扩展方法,并在其中添加一个名为Update()的方法。

public static class LinqToSqlExtensions 
{ 
    public static void Update(this System.Data.Linq.Table<GeneralContractLine> table, GeneralContractLine item) 
    { 
     var connectedItem = table.FirstOrDefault(x => x.ID == item.ID); 
     //Update logic in this case updating only the name 
     connectedItem.Name = item.Name; 
     table.Context.SubmitChanges(); 
    } 
} 

就像一个没有,我没有测试过任何这一点,但它可能是东西,是值得尝试的

哦,如果它的工作原理,称这应该只是一个在命名空间中添加使用语句,然后调用db.GeneralContractLine.Update(line);

+0

此外,如果这个工作,你需要为多个实体做它可能会尝试使用和反射更通用的版本 – Manatherin