22 Mayıs 2016

"Cannot evaluate expression because a thread is stopped at a point where garbage collection is impossible..." Hatası

Merhabalar;

Geçenlerde veritabanından bir nesneyi doldurup işlem yapacaktım, böyle bir hata ile karşılaştım breakpoint koyup nesneye ne dolduruyor diye bakacekken:


Ben debug yaparken meğerse release configuration modunda yapıyormuşum o an. Kısaca bir araştırınca farkettim.


Hatanın hemen öncesinde bir publish yapmak için release'e çekmiştim. Debug moda geri alınca hatadan kurtuldum.

Herkese kolay gelsin.



Devamını oku ...

4 Aralık 2015

Asp.Net MVC ve Entity Framework İle Veritabanı İşlemleri (Veri Güncelleme)

Merhabalar,

Önceki yazımda anlattıklarıma ek olarak bu yazımda sizlerle EF ile bir MVC projesinde veri güncelleme (edit) işlemini anlatacağım. Önceki projemiz üerinden devam edeceğim.

CustomerController'ımıza Customer edit işlemini yapacak bir action yazalım ve daha önce yaptığımız gibi parantezler içine sağ tıklayıp Add View diyelim:



Bu işlemden sonra Edit.cshtml dosyası bizim için oluşturuluyor:

@model BlogEFApp.Models.Customers

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Edit</title>
</head>
<body>
    <script src="~/Scripts/jquery-1.8.2.min.js"></script>
    <script src="~/Scripts/jquery.validate.min.js"></script>
    <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
   
    @using (Html.BeginForm()) {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
   
        <fieldset>
            <legend>Customers</legend>
   
            <div class="editor-label">
                @Html.LabelFor(model => model.CustomerID)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.CustomerID)
                @Html.ValidationMessageFor(model => model.CustomerID)
            </div>
   
            <div class="editor-label">
                @Html.LabelFor(model => model.CompanyName)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.CompanyName)
                @Html.ValidationMessageFor(model => model.CompanyName)
            </div>
   
            <div class="editor-label">
                @Html.LabelFor(model => model.ContactName)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.ContactName)
                @Html.ValidationMessageFor(model => model.ContactName)
            </div>
   
            <div class="editor-label">
                @Html.LabelFor(model => model.ContactTitle)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.ContactTitle)
                @Html.ValidationMessageFor(model => model.ContactTitle)
            </div>
   
            <div class="editor-label">
                @Html.LabelFor(model => model.Address)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Address)
                @Html.ValidationMessageFor(model => model.Address)
            </div>
   
            <div class="editor-label">
                @Html.LabelFor(model => model.City)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.City)
                @Html.ValidationMessageFor(model => model.City)
            </div>
   
            <div class="editor-label">
                @Html.LabelFor(model => model.Region)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Region)
                @Html.ValidationMessageFor(model => model.Region)
            </div>
   
            <div class="editor-label">
                @Html.LabelFor(model => model.PostalCode)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.PostalCode)
                @Html.ValidationMessageFor(model => model.PostalCode)
            </div>
   
            <div class="editor-label">
                @Html.LabelFor(model => model.Country)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Country)
                @Html.ValidationMessageFor(model => model.Country)
            </div>
   
            <div class="editor-label">
                @Html.LabelFor(model => model.Phone)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Phone)
                @Html.ValidationMessageFor(model => model.Phone)
            </div>
   
            <div class="editor-label">
                @Html.LabelFor(model => model.Fax)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Fax)
                @Html.ValidationMessageFor(model => model.Fax)
            </div>
   
            <p>
                <input type="submit" value="Edit" />
            </p>
        </fieldset>
    }   
    <div>
        @Html.ActionLink("Back to List""Index")
    </div>
</body>
</html>

Burada ben ufak değişiklikler yaptım, başlık ve buton adını değiştirmek gibi. Bu kısım size kalmış.

Buradaki @Html.ActionLink("Back to List""Index"yazan satırdaki "Index" yazan yere önceki yazımızda oluşturduğumuz ve veri listelemek için kullandığımız "List" action adını yazarsak bu 'Back to List' yazan yere tıkladığımızda CustomerController'daki List action'u çalışacaktır ve Customers'ı listeleyecektir.
Bir de buradaki primary key alanı olan CustomerID'yi silmemiz gerekir. PK. alanını düzenleyebiliyor olmak iyi bir fikir olmazdı değil mi? Şu kısmı uçuralım:

<div class="editor-label">
                @Html.LabelFor(model => model.CustomerID)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.CustomerID)
                @Html.ValidationMessageFor(model => model.CustomerID)

            </div>


Şimdi vereceğimiz primary key'e göre Customers tablosundan ilgili satırı getiren bir metod yazalım yine ilk yazımda oluşturduğumuz NWBusinessLogic.cs dosyasına:

public Customers GetCustomer(string CustomerID)
{
     using (var ctx = new NORTHWNDEntities())
     {
           Customers Customer = new Customers();
           Customer = (from x in ctx.Customers 
                       where x.CustomerID == CustomerID 
                       select x).FirstOrDefault();
           return Customer;
     }
}


Yazının en başında oluşturduğumuz Edit'i aşağıdaki gibi düzenleyelim:

[HttpGet]
public ActionResult Edit(string CustomerID)
{
     NWBusinessLogic nwBusiness = new NWBusinessLogic();
     return View(nwBusiness.GetCustomer(CustomerID));
}


Önceki yazımda verileri listelediğimiz List.cshtml içinde şöyle bir kod vardı hatırlarsak:

@Html.ActionLink("Edit""Edit"new { /* id=item.PrimaryKey */ })


Bu kısım Edit linkine tıkladığımızda ne yapmak istediğimize göre değişecek. Edit'e tıkladığımızda Edit.cshtml çalışacak ve hangi primary key'e göre çalışacağını bizim belirlememiz gerek. Bu linki şöyle değiştirelim:

@Html.ActionLink("Edit""Edit"new { CustomerID = item.CustomerID })


Bu işlemlerden sonra artık değiştirmek istediğim verinin Edit linkine tıklarsak bu veriye ait olan bilgiler ekrana gelecek ve değiştirilebilir olacak. Sıra bu değişiklikleri kaydetme işleminde. NWBusinessLigic.cs içine aşağıdaki metodu yazalım:

public Customers UpdateCustomer(Customers Customer)
        {
            using (var ctx = new NORTHWNDEntities())
            {
                var c = ctx.Customers.FirstOrDefault(i => i.CustomerID == Customer.CustomerID);
                if (c != null)
                {
                    c.CompanyName = Customer.CompanyName;
                    c.ContactName = Customer.ContactName;
                    c.ContactTitle = Customer.ContactTitle;
                    c.Address = Customer.Address;
                    c.City = Customer.City;
                    c.Region = Customer.Region;
                    c.PostalCode = Customer.PostalCode;
                    c.Country = Customer.Country;
                    c.Phone = Customer.Phone;
                    c.Fax = Customer.Fax;
                    ctx.SaveChanges();
                }
                return c;
            }
        }


Son olarak CustomerController içine şunu yazmamız yeterli:

[HttpPost]
        public ActionResult Edit(Customers Customer)
        {
            using (var ctx = new NORTHWNDEntities())
            {
                if (ModelState.IsValid)
                {
                    NWBusinessLogic nwBusiness = new NWBusinessLogic();
                    nwBusiness.UpdateCustomer(Customer);
                }
                return View();
            }
        }


Verileri listeleyip birinin Edit linkine tıklayalım:



Seçilen kayıt için aşağıdaki ekran açılacaktır. Düzenleyip Edit butonuna basalım:



Değişikliği veritabanında görelim:




Biraz karmaşık anlattım gibime geldi. Anlaşılmayan bir yer olduysa lütfen bana yazın.

İyi çalışmalar.



Devamını oku ...