2015-05-19 5 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

Ты гениальный.thanks много Sir.i не знаю, почему я использовал прогнозы. Спасибо – v2v2

0

Вы изменяете имущество вашего MyPoco объекта. Это всего лишь представление вашей таблицы. Вот почему база данных не обновляется.

Вы можете отправить свой MyPoco своему клиенту. Он будет выполнять некоторые изменения. Затем вы можете воссоздать объект и скопировать свойства из объекта Poco. Затем вам необходимо добавить attach измененный объект в таблицу, а затем сохранить изменения.

Если вы изменяете непосредственно объект, нет необходимости присоединяться, так как он сохранит ссылки на базу данных (если вы делаете это с тем же Databasecontext).

+0

Любое предложение, что я должен изменить? – v2v2

+0

Для каждого объекта, который вы хотите обновить (и, очевидно, перед отправкой изменений), вы должны сообщить Entity Framework, что объект был обновлен. Если вы не указали иное (я не предполагаю, что нет), EF не обратит внимание на эти объекты. Итак, следуйте статье, которую предоставил Kryptos, и все должно быть в порядке. – hbulens

+0

@hbulens OP не использует EF, а System.Data.Linq (то есть LinqToSQL). Во всяком случае, понятия одинаковы. – Kryptos

Смежные вопросы