2015-05-19 115 views
0

我已经尝试了很多,但都是徒劳的。
我写了一个LINQ代码,但无法保存数据库中的更改。
它没有错误,也没有更新记录。linq更新不起作用

class Program 
{ 
    [Table(Name = "mainframe_replication")] 
    public class mainframe_replication 
    { 
     private string _REPL_GUID; 
     [Column(IsPrimaryKey = true, Storage = "_REPL_GUID")] 
     public string REPL_GUID 
     { 
      get { return this._REPL_GUID; } 
      set { this._REPL_GUID = value; } 
     } 

     private string _REPL_TYPE; 
     [Column(Storage = "_REPL_TYPE")] 
     public string REPL_TYPE 
     { 
      get { return this._REPL_TYPE; } 
      set { this._REPL_TYPE = value; } 
     } 

     private string _RPT_ID; 
     [Column(Storage = "_RPT_ID")] 
     public string RPT_ID 
     { 
      get { return this._RPT_ID; } 
      set { this._RPT_ID = value; } 
     } 

     private string _RPT_VERS; 
     [Column(Storage = "_RPT_VERS")] 
     public string RPT_VERS 
     { 
      get { return this._RPT_VERS; } 
      set { this._RPT_VERS = value; } 
     } 

     private string _RPT_BYTES; 
     [Column(Storage = "_RPT_BYTES")] 
     public string RPT_BYTES 
     { 
      get { return this._RPT_BYTES; } 
      set { this._RPT_BYTES = value; } 
     } 

     private string _REPL_DTM; 
     [Column(Storage = "_REPL_DTM")] 
     public string REPL_DTM 
     { 
      get { return this._REPL_DTM; } 
      set { this._REPL_DTM = value; } 
     } 

     private string _NOTIF_ID; 
     [Column(Storage = "_NOTIF_ID")] 
     public string NOTIF_ID 
     { 
      get { return this._NOTIF_ID; } 
      set { this._NOTIF_ID = value; } 
     } 
    } 

    public class MyPoco 
    { 
     public string ReportId { get; set; } 
     public string Reportversion { get; set; } 
     public string ReportBytes { get; set; } 
     public string ReportDate { get; set; } 
     public string NotifId { get; set; } 
     public string RecipAdd { get; set; } 
    } 

    public static string loglocation; 
    static void Main(string[] args) 
    { 
     try 
     { 
      using (DataClasses1DataContext db = new DataClasses1DataContext()) 
      { 
       Table<NOTIF_RECIP> NOTIF_RECIP_alias = db.GetTable<NOTIF_RECIP>(); 
       Table<NOTIF_SCHED> NOTIF_SCHED_alias = db.GetTable<NOTIF_SCHED>(); 
       Table<mainframe_replication> mainframe_replication_alias = db.GetTable<mainframe_replication>(); 

       var ids = NOTIF_SCHED_alias.Select(x => x.NOTIF_RPT_ID).ToArray(); 

       foreach (string notif_sched_data in ids) 
       { 
        var repljoinmf = mainframe_replication_alias 
         .Join(NOTIF_RECIP_alias, mfr => mfr.RPT_ID, nr => nr.NOTIF_RECIP_ID, (mfr, nr) 
          => new MyPoco { ReportId = mfr.RPT_ID, Reportversion = mfr.RPT_VERS, ReportBytes = mfr.RPT_BYTES.ToString(), ReportDate = mfr.REPL_DTM.ToString(), NotifId = mfr.NOTIF_ID, RecipAdd = nr.NOTIF_RECIP_ADDR }); 

        foreach (var repljoinmf_data in repljoinmf) 
        { 
         repljoinmf_data.NotifId = "abc"; 

         //DO STUFF 
         // repljoinmf_data.NotifId = "Changedxyz"; 
        } 
        db.SubmitChanges(); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
    } 
} 

它在提交更改时没有提供任何错误。
我需要改变什么?
任何建议都会有所帮助。

+6

你应该只显示一小段代码,这太过分了。 – JasonNew

+0

实际上我认为人们的第一个评论将是关于丢失的主键,所以AI添加了整个代码来显示我在这里有主键。感谢您的建议,我将删除不需要的代码。 – v2v2

+0

您正在创建一个与您的数据库无关的MyPoco实例 - 如果您想更新数据库,您需要使用实体类型,而不是数据中的其他类型_projected_。 –

回答

0

如果要将更改保存回原始数据源,则需要使用实际实体,而不是使用这些实体的预测。既然你加入两个表,一个选择是把这些实例到一个匿名类型和更新它们:

foreach (string notif_sched_data in ids) 
{ 
    var repljoinmf = mainframe_replication_alias 
     .Join(NOTIF_RECIP_alias, 
       mfr => mfr.RPT_ID, 
       nr => nr.NOTIF_RECIP_ID, 
       (mfr, nr) => new {mfr, nr}); 

    foreach (var repljoinmf_data in repljoinmf) 
    { 
     //DO STUFF 
     repljoinmf_data.mfr.NotifId = "Changedxyz"; 
    } 
    db.SubmitChanges(); 

在你前面的问题,你被告知,匿名类型不能uptated,但在这种情况下,你通过匿名类型修改引用的的实例。所以你不更新匿名类型本身,只是匿名类型引用的对象。

+0

你是genious.thanks很多Sir.i不知道我为什么使用projection.Thanks – v2v2

0

您正在修改您的MyPoco对象的属性。这只是表格的一个表示。这就是数据库没有更新的原因。

您可以将MyPoco发送给您的客户。它会执行一些更改。然后,您可以重新创建实体并从Poco对象复制属性。然后,您需要将修改后的实体attach添加到您的表格中,然后保存更改。

如果您直接修改实体,则无需附加,因为它将保留指向数据库的链接(假设您使用相同的DatabaseContext执行该操作)。

+0

任何建议我应该改变什么。? – v2v2

+0

对于每个想要更新的实体(显然在提交更改之前),必须告知实体框架实体已更新。除非您另有指定(我不承认),否则EF不会注意这些实体。所以按照Kryptos提供的文章,你应该没问题。 – hbulens

+0

@hbulens OP不使用EF而是System.Data.Linq(即LinqToSQL)。无论如何,这些概念确实是一样的。 – Kryptos