24.3.15

Yeni başlayanlar için programlama dilleri

Merhabalar, daha öncesinde 2014 yılının trend programlama dillerini bir makaleden alıntılar yaparak özetlemiştim. İnternette 2015 yılı içinde programlama dilleri arasında nasıl bir makasın açılığını görmek için yaptığım araştırmalarda, firma ve hobi bazlı kişilerin neler öğrenmeleri gerektiğini anlatan güzel bir resim buldum.
Umarım yeni başlayanlar için bir yol gösterici niteliği olur, bol kodlu günler.

6.3.15

Javascript içerisinde C# List kullanımı

Merhabalar,
MVC projesi geliştirenler dinamik içerikler için genelde javascript methodlarından yararlanır. Bu tür metodlar var olan metodlardan(ajax, getJson, postJson vb.) seçilebileceği gibi kullanıcı tarafından da oluşturulabilir. Bu yazımda Razor View Engine ile oluşturulmuş bir MVC projesi içerisinde, serverda C# ile oluşturduğumuz List objesini javascript tarafında nasıl kullanacağımıza değineceğim.
Senaryomuz şu şekilde olacak;
- Kullanıcının göreceği ekran için Controller içerisinde Home() adında bir Action oluşturulmuş.
- View tarafına oluşturduğum modeli göndermek ve Javascript kullanarak view içerisinde liste içersinde dönerek ekrana listedeki objenin değerlerini göstermek istiyorum.
Server Tarafı Örnek Kodu;
public ActionResult Home()
{
HomeViewModel model = new HomeViewModel();
List<TimeLine> myList= new List<TimeLine>(); 
TimeLine element= new TimeLine ();
element.Name= "abc";
element.About= "ssss";
element.Id = id;

myList.Add(element);

System.Web.Script.Serialization.JavaScriptSerializer oSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
model.JSONList= oSerializer.Serialize(myList);

return View(model);
}
Javascript tarafında listenin kullanılabilir hale gelmesi için listeyi javascript'in anlayacağı hale getirmek amacıyla serializer kullanmamız gerekiyor. Gönderdiğimiz bu bloğun çalışması için de kullanıcı tarafında bunu uygun tipte karşılamamız gerekiyor. Script tarafında ise böyle karşıladığımızı düşünelim.
Kullanıcı Tarafı:
$(function() {
    Draw();
});

function Draw() {
    var tunel = '@Model.JSONList';
    var str = "";
    if (tunel.length > 0) {
        for (var i = 0; i < tunel.length; i++) {
            str += '<span>'+tunel[i].Name+'</span>'+
            '<span>'+tunel[i].Id+'</span>'+
            '<span>'+tunel[i].About+'</span>';
        }
        $("#myDiv").append(str);
    }
}
Burada tunel degiskeni içerisine serverdan gelen listeyi almışız fakat listeyi serialize etmiştik javascript bunu şu an string değer olarak görmekte. Gördüğü değer ise şu şekilde;
var tunel = JSON.parse('[{&quot;Id&quot;:3,&quot;Tarih&quot;:&quot;\/Date(1425506400000)\/&quot;,&quot;Tip&quot;:2,&quot;Hakkinda&quot;:&quot;- Proje, g&#246;rev, todo d&#246;k&#252;mlerini g&#246;ster.&quot;,&quot;Adı&quot;:&quot;Profil Ekranının Tasarlanması&quot;},{&quot;Id&quot;:26,&quot;Tarih&quot;:&quot;\/Date(1425160800000)\/&quot;,&quot;Tip&quot;:1,&quot;Hakkinda&quot;:&quot;Kişisel işlerin d&#252;zenlenmesi i&#231;in geliştirilen proje.&quot;,&quot;Adı&quot;:&quot;Kişisel Yazılım Asistanı&quot;}]')
Bu değeri düzeltmek içinse tekrardan parse etmemiz gerekiyor;
var tunel = JSON.parse('@Html.Raw(Model.JSONList)');
Böylece List şeklinde C# da oluşturduğumuz bir değişkeni rahatça kullanabiliyoruz.
Umarım sizin de işinize yarar.

11.2.15

Oracle Veritabanı İçerisindeki System.InvalidOperationException Hatası ve Çözümü

Geliştirdiğim MVC projelerinde gördüm ki Entity Framework SQL veritabanı ile mükemmel çalışıyor. Doğru veritabanı oluşumunu sağladıktan sonra kaydetme, güncelleme ve silme gibi temel işlemleri EF yardımıyla kolayca yapabiliyoruz. Şu ana kadar bu tür temel işlemler içerisinde sebebini bulamadığım hatalarla karşılaşmamıştım. Ne yazık ki bu mutluluğum EF ile Oracle veri tabanını kullanmaya başladığımda biraz olsun can sıkıcı hale geldi.
Bu yazımda EF ile Oracle veritabanını ilişkilendirdiğimizde, birden fazla kayıt yapmak isterken karşımıza çıkan System.InvalidOperationException hatası ve çözümünü ele alacağım.
Örnek kodumuz;
foreach (var doc in documents)
{
    EkBelge belge = EkBelge(doc);
    context.AddToDocuments(belge);
}
try
{
    context.SaveChanges();
}
catch (Exception ex)
{
    Console.WriteLine(ex.ToString());
}
Birden fazla işlemi tek seferde kaydetmek istediğimizde EntityFramework bu kayıt sanki daha kaydetmeden üzerine yazmak istiyormuşçasına davranıyor. Dolayısıyla aşağıdaki hatayı fırlatıyor.
System.InvalidOperationException: The changes to the database were committed successfully, but an error occurred while updating the object context. The ObjectContext might be in an inconsistent state. Inner exception message: AcceptChanges cannot continue because the object's key values conflict with another object in the ObjectStateManager. Make sure that the key values are unique before calling AcceptChanges.
Bu hatayı düzeltmek için .edmx dosyasının .xml halini açmamız gerekiyor. Oracle da her ne kadar düzgün bir yapılandırma yapsakta(auto increment, identity, primary key vb.), otomatik id arttırma olayını bazen burada göremeyebiliyor. Vs2012'ye gelen SP1.0 güncellemesiyle düzeldiği söylediyse, daha üst bir sürüm kullanan veya güncelleme yapmayan kişiler için .edmx dosyası içerisinde hatayı aldığımız primary key alanına StoreGeneratedPattern="Identity" özelliğini eklememiz gerekiyor.
<EntityType Name="SECKIN">
          <Key>
            <PropertyRef Name="ID" />
          </Key>
          <Property Name="ID" Type="number" Nullable="false"
              MaxLength="10" StoreGeneratedPattern="Identity"/>                 
 </EntityType>
Hangi alanın identity olacağını belirttiğimiz için EF bunu bilerek hareket ediyor ve ilgili hatayı gideriyor. Yeni bir güncellemeyle düzelene kadar umarım bu tür bir yaklaşım kodunuzda ilerlemenize yardımcı olur.
Bol kodlu günler.