2011-11-11 6 views
1

基本的に私はこのフィールドをXMLで更新したいと思っています。これはXMLで解析されており、この単一のレコードをこの1つのインスタンスからどのように更新するかはわかりません。LINQ-to-SQL単一XMLレコードを更新するには?

var dataContext = 
    new RequestFormsDBDataContext(ConfigManager.Data.ConnectionString); 

var userForm = (
    from i in dataContext.RequestFormItems 
    join c in dataContext.RequestFormInstances on i.TypeGuid equals c.TypeGuid 
    where i.Id == FormID 
    select new { 
     i.Id, 
     XmlData = XElement.Parse(i.XML) 
    } 
).ToList(); 


// Parsing out XML Data 
var userFormParced = (
    from i in userForm 
    select new FormItem { 
     FormId = i.Id, 
     DateTimeCompleted = i.XmlData.Element("DateTimeCompleted").Value 
    } 
).FirstOrDefault(); 

RFDateTimeCompleted = userFormParced.DateTimeCompleted; 

// Code that isnt working 
userFormParced.DateTimeCompleted = "New Data"; 
dataContext.SubmitChanges(); 

答えて

2

データベースから取得するインスタンスを変更していないため、これは機能しません。元の値を2回使用して新しいオブジェクトを作成してから、それを変更します。 LINQ-to-SQLのコンテキストには、データベースの行を変更するという知識はなく、関係のないXMLだけを構築しています。

まず、あなたは、データベースから取得した値が

XmlData = XElement.Parse(i.XML) 

、その後のXElementに入れているあなたは、ノードから「値」を取得してに別の新しいオブジェクトをそれを置く

select new FormItem 
{   
    FormId = i.Id,   
    DateTimeCompleted = i.XmlData.Element("DateTimeCompleted").Value  
} 

このステージでは、LINQからSQLへの参照が失われています。代わりに、を置き換えてに変更する必要があります。

データベースでXMLを使用している場合は、LINQ-SQLオブジェクトのXMLプロパティにマップするXML列を使用する必要があります。そうではないので、回避策を実装します。

このようなものを試してみてください。

// just get the item 
var userForm = (
    from i in dataContext.RequestFormItems 
    join c in dataContext.RequestFormInstances on i.TypeGuid equals c.TypeGuid 
    where i.Id == FormID 
    select i).FirstOrDefault(); 

// parse the XML 
var xml = XElement.Parse(userForm.XML); 

RFDateTimeCompleted = xml.Element("DateTimeCompleted").Value; 
xml.Element("DateTimeCompleted").Value = "New Data"; 

// and finally, because you're again just changing XML 
// unrelated to the context, update the original object 
userForm.XML = xml.ToString(); 
context.SubmitChanges(); 
+0

あなたは素晴らしいです!それは魅力的に働いた! –

関連する問題