2016-03-22 19 views
0

Soruların listesini yeniden düzenlemek isterseniz, örneğin, son soruyu harekete geçirirseniz, yaptığım her şey önce anahtarın değeridir, ama bana öyle geliyor ki yanlış olduğunu ve kanıt bu iletiyi alırsınız: tip system.data.dll 'bir istisna EntityFramework.dll oluştu amaBirinci sınıf listeye atla

bilgiye kullanıcı kodu işlenmedi

: mülkiyet 'kimlik' bir parçasıdır Nesnenin önemli bilgileri ve değiştirilemez.

public ActionResult Up(int id , string st) 
{ 
    var qus = db.Qusetions.Find(id); 

    if(st == "up") 
    { 
     if(qus.ID != 1) 
     { 
      qus.ID = -1; 
      var qusup = db.Qusetions.SingleOrDefault(q => q.ID == q.ID - 1); 
      if (qusup != null) 
      { 
       qusup.ID = id; 
      } 
     }   
    } 
    if (st == "down") 
    { 
     qus.ID = +1; 
     var qusup = db.Qusetions.SingleOrDefault(q => q.ID == q.ID + 1); 
     if (qusup != null) 
     { 
      qusup.ID = id; 
     } 
     db.SaveChanges(); 
    } 

    return RedirectToAction("Index", new RouteValueDictionary(new { controller = "Qustions", action = "Index", id = id })); 
} 
+1

Sadece birincil anahtarınız için bir Id sütununda değişiklik yapmayın. Varlıkları sıralamak için kullanacağınız yeni bir SortIndex sütun ekleyin. Ardından, ihtiyacınız olan bu yeni özelliği değiştirin. – Lesmian

+0

Yardımlarınız için teşekkür ederiz, ancak listeyi Sıralamayı İndeks – Sultan

+1

db.Qusetions.SingleOrDefault (q => q.SortIndex == q.SortIndex - 1) ile sıralıyorum. Sadece mevcut sıralama düzenini tutacak başka bir alan tanıtın. Birincil anahtarınızın Kimlik değerlerini değiştiremezsiniz. – Lesmian

cevap

0

Gerçekten bu amaç için birincil anahtar Id kullanmamalısınız. Soruları sıralamanın tek amacı için hizmet verecek olan Question ürününe bir özellik eklemek çok daha iyidir.

public class Qusetion 
{ 
    // ... 
    public int SortIndex {get; set;} 
    // ... 
} 

Kişisel denetleyicisi eylem böyle bir şey olurdu:

public ActionResult ChangeSortIndex(int id , string st) 
{ 
    var qus = db.Qusetions.Find(id); 

    if(qus != null) 
    { 
     switch(st) 
     { 
      case "up": 
       qus.SortIndex++; 
       break; 

      case "down": 
       qus.SortIndex--; 
       break; 
     } 

     db.SaveChanges(); 
    } 

    return RedirectToAction("Index", new RouteValueDictionary(new { controller = "Qusetions", action = "Index", id = id })); 
} 

Ve Sorularınızı görüntülediğinizde bunları sıralamak zorunda:

var questions = db.Qusetions.OrderBy(x => x.SortIndex) 

Ayrıca SortIndex güncelleme unutmayın gerçekten basit bir yol (++ ve -) ve istediğiniz sıralamayı elde etmek için birkaç indeksi güncellemeniz gerekecektir. Küçük listeler için bu çalışabilir sanırım. Bir yazım hatası olduğunu Kodunuzda ya da gerçekten heceliyorsun: What's the best way to manage list item sort order

Not:

Sen gibi ayrıntılı bir şey daha kullanabilirsiniz Quse tion?

+0

Bana karşı açtığı ikilemi açıklamak için çok güzel ve benim için yeni ufuklar açmıştı ve aslında yüzlerce fonksiyondan önce yanlışlık yanlıştı ve değiştirmeme izin vermedim. Son revizyonda, Tanrı istekli olacak. Selamlar sana, O yaratıcısı – Sultan