kazimyaver | "Bilgiye yapılan yatırım en yüksek kârı getirir."

There is already an object named 'tableName' in the database.

Merhaba,

Code First yöntemi ile oluşturduğunuz databasede, zamanla modellerde değişiklik yapma ihtimaliniz var. Karışıklığa sebebiyet verip There is already an object named 'tableName' in the database. hatası ile karşılaşmanız durumunda telaşa kapılmadan yeniden Migration oluşturmanız ve Update-Database yapmanız sizi kurtaracaktır.

 "Package Manager Console" açarak şu komutları uyguluyoruz.

Add-Migration Initial -IgnoreChanges

Update-Database -verbose

Umarım yararlı olur. İyi günler.

The Database Could Not be Exclusively Locked to Perform the Operation. (Microsoft SQL Server, Error: 5030)

Merhaba,

Microsoft SQL Server'da Database ismi değiştirmeye çalıştığınızda The database could not be exclusively locked to perform the operation. (Microsoft SQL Server, Error: 5030) şeklinde hata alıyorsanız izlemeniz gereken adımlar şu şekilde olacak.

Veritabanınızı önce tek kullanıcı moduna almanız gerekiyor.

ALTER DATABASE dbName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE

Şimdi veritabanını yeniden adlandıracağız.

ALTER DATABASE dbName MODIFY NAME = dbNewName

İsim değişikliğinden sonra veritabanımızı eski haline getiriyoruz çok kullanıcılı mod.

ALTER DATABASE dbName
SET MULTI_USER WITH ROLLBACK IMMEDIATE

Umarım yararlı olmuştur. İyi günler.

ASP.NET MVC Çoklu Dil Desteği / Multi Language

Merhaba, ASP.NET MVC uygulamamızda çoklu dil desteği çalışmasını hızlı bir şekilde gerçekleştirelim;

Öncelikle yeni bir proje oluşturuyoruz oluşturduğumuz projenin menü alanını dile göre şekillendireceğiz. 

Solution Explorer'a sağ tıklayarak yeni bir klasör ekleyelim Resources isminde. Oluşturduğumuz klasöre sağ tıklayarak Add > New Item > General sekmesi altından Resource File ekliyoruz istediğiniz ismi verebilirsiniz ben Home ismini kullandım. 


Name kısmına değişken isimlerimizi belirliyoruz. Value kısmına da bu alanların değerlerini giriyoruz. Access Modifier : seçeneğinden Public seçili olması gerekiyor.

Daha sonra Home.resx dosyasına sağ tıklayarak copy - paste yapıyoruz. İsmini değiştirerek Home.tr.resx yapıyoruz. İçinde ki Value alanlarını Türkçe'ye çeviriyoruz.

Projemizde View > Shared klasörü altından _Layout.cshtml'i açarak. Menü alanında bulunan;

@Html.ActionLink("Home""Index""Home")

Şeklinde olan kısımdan linkText alanına Resources'dan gelen değerimizi yazacağız.

@Html.ActionLink(MultiLanguage.Resources.Home.Home, "Index""Home")

Şeklinde olacak. Tüm değişiklik gösterecek alanları da ayarladıktan sonra yeni bir Language adında Controller eklememiz gerekiyor. 

Yeni bir action ekliyoruz şu şekilde olacak;

public ActionResult Change(String languageSelect)
{
    if (languageSelect != null)
    {
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(languageSelect);
         Thread.CurrentThread.CurrentUICulture = new CultureInfo(languageSelect);
    }

    HttpCookie cookie = new HttpCookie("language");
    cookie.Value = languageSelect;
    Response.Cookies.Add(cookie);

    return View("Index");
}

Global.asax dosyasına girerek Application_BeginRequest'i düzenliyoruz. Eğer yoksa baştan oluşturabilirsiniz.

protected void Application_BeginRequest(object sender, EventArgs e)
{
    HttpCookie cookie = HttpContext.Current.Request.Cookies["Language"];
    if (cookie != null && cookie.Value != null)
    {
       System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cookie.Value);
       System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(cookie.Value);
    }
    else
    {
       System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en");
       System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en");
    }
}

Global.asax dosyasına girerek Application_BeginRequest'i düzenliyoruz. Eğer yoksa baştan oluşturabilirsiniz.

Derleyip çalıştırdığımız zaman dil seçimine göre sayfa içerisinde ki textlerin değiştiğini göreceksiniz. Umarım yararlı olur kaynak kodları aşağıda paylaşıyorum. Bir sonra ki yazıda görüşmek üzere.

Kaynak Kodları 

ASP.NET Session Clear on Browser Close

Merhaba, ASP.NET ile geliştirdiğiniz uygulamalarda Session'a aldığınız değerleri Browser kapatıldıktan sonra temizlemek için bu yöntemi kullanabilirsiniz. 

<script type="text/javascript">        
    $(document).ready(function () {        
        window.addEventListener('beforeunload',recordeCloseTime);     
    });     
    function recordeCloseTime() {        
        $.ajax({ 
            type: "POST",        
            url: "ServiceToClearSession.asmx/RecordCloseTime",     
        });         
    } 
</script>

Daha sonra projemize ServiceToClearSession.asmx dosyası ekliyoruz içerisine..

[WebMethod(EnableSession = true)]
public void RecordCloseTime(){  
    HttpContext.Current.Session.Clear();}

Umarım faydalı olmuştur. iyi çalışmalar.

SQL Identity Reset

 -- Product tablosunda ki verileri temizliyor.
 DELETE FROM [dbo].[Product]
 -- Product tablosunda ki Identity'leri sıfırlayarak 1'den başlamasını sağlıyor.
 DBCC CHECKIDENT('Product', RESEED, 0)
 -- İşlemlerin ne kadar sürede gerçekleştiğini veriyor.
 SET STATISTICS TIME ON

JQuery Seo URL Replace

Merhaba, 

Textbox'a girilen değeri farklı bir Textbox'a SEO'ya uygun hale getiren scripti paylaşıyorum.


$(document).ready(function () {
            $("#CategoryName").on("keyup", function () {
                str = $(this).val();
                str = replaceSpecialChars(str);
                str = str.toLowerCase();
                str = str.replace(/\s\s+/g, ' ').replace(/[^a-z0-9\s]/gi, '').replace(/[^\w]/ig, "-");
                function replaceSpecialChars(str) {
                    var specialChars = [["ş", "s"], ["ğ", "g"], ["ü", "u"], ["ı", "i"], ["_", "-"],
                                        ["ö", "o"], ["Ş", "S"], ["Ğ", "G"], ["Ç", "C"], ["ç", "c"],
                                        ["Ü", "U"], ["İ", "I"], ["Ö", "O"], ["ş", "s"]];
                    for (var i = 0; i < specialChars.length; i++) {
                       str = str.replace(eval("/" + specialChars[i][0] + "/ig"), specialChars[i][1]);
                    }
                    return str;
                }
                $("#CategoryUrl").val(str);
            });
});

İki Veritabanını Karşılaştırma - Compare the two Database

Merhabalar, sonradan devraldığınız ve çok sık bakma fırsatınızın olmadığı bir proje de veritabanı üzerinde yapacağınız değişiklikleri unutma olasılığınız oldukça yüksek. Yani benim için öyle oldu diye biliriz. Tabi bu senaryo sizler için daha farklı olabilir. İhtiyacımız İki veritabanını karşılaştırmak ve farkları tespit edip hızlı bir şekilde o değişiklikleri uygulamak ise imdadımıza Red Gate SQL Compare yetişiyor.

Bu adresten 14 günlük deneme sürümünü indirerek uygulamayı bilgisayarımıza kuruyoruz. SQL Compare uygulamasını çalıştırarak gelen ekrandan;


Bize hangi veritabanlarını karşılaştırmak istediğimizi soruyor? Server alanında bağlantımızı seçiyoruz. Database alanından karşılaştırılacak veritabanını seçiyoruz. Daha sonra Compare Now butonuna tıklıyoruz. 


Tarama işlemini problemsiz olarak tamamladığı zaman karşımıza böyle bir ekran çıkıyor. OK butonuna basarak devam ediyoruz.


Karşımıza gelen ekranda 2 tablonun uyuşmadığını 57 tane uyuşan tablonun olduğunu söylüyor. Sol tarafında bulunan artıya tıklayarak hangi alanların uyuşmadığını kontrol ediyoruz.


Product tablosunda Title diye bir alanın fazlalık olduğunu söylüyor. Categories tablosunda da bir farklılık varmış. Değişikliğin uygulanmasını istediğimiz tabloları Check ediyoruz. Daha sonra pencerenin üst kısmında bulunan Deployment Wizard.. butonuna tıklıyoruz. Daha sonra bize Script üretiyor SQL tarafında o scripti çalıştırarak istediğimiz değişikliği uygulayabiliriz. 

ASP.NET MVC Area Hatası - Multiple types were found that match the controller named

Merhaba, 

Multiple types were found that match the controller named 'Home'. This can happen if the route that services this request ('{controller}/{action}/{id}') does not specify namespaces to search for a controller that matches the request. If this is the case, register this route by calling an overload of the 'MapRoute' method that takes a 'namespaces' parameter.

Yukarıda ki hatayı alıyorsak eğer büyük ihtimalle bir Area ekledik ve Controller'larımız çakışıyor. Bu hatanın çözümü oldukça basit. Ulaşmak istediğimiz sayfaların Controller'larını tanımlamamız gerekmekte. 
Solution Explorer penceresinden App_Start klasörüne girerek, RouteConfig.cs dosyamızı açıyoruz.
routes.MapRoute(
  name: "Default",
  url: "{controller}/{action}/{id}",
  defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
  namespaces: new string[] { "ProjeAdi.Controllers" }
);

İlk açtığımızda yukarıda ki kalın punto ile seçili kodun olmadığını göreceğiz. Ekleme işlemini gerçekleştiriyoruz. Daha sonra aynı işlemi, Area > Admin > AdminAreaRegistration.cs dosyasına uyguluyoruz. 

namespaces: new string[] { "ProjeAdi.Areas.Admin.Controllers" }

Burada ki Admin'in yerinde sizin oluşturduğunuz Area'nın ismi olabilir. Projemizi derleyip kontrol edebilirsiniz.

İyi çalışmalar.

SQL Schema Hatası ve Değiştirme

Merhabalar,

Oldukça basit fakat bir o kadar can sıkıcı bir hata. Veritabanı taşıma işleminden sonra amansızca tabloları göremeyip hazırladığımız projenin sağdan soldan patladığını gördüğümüzde aklımıza gelebilecek bir çözüm yönetimi.

Öncelikle bu hata ile karşı kaşıya olup olmadığınızı kontrol edin. Taşıma işlemini gerçekleştirmeden önce ki veritabanınızın içinde ki tablo isimlerinin başında dbo.TabloAdi şeklinde bir ibare bulunuyor, taşıdıktan sonra ki tablo isimlerinin başında user.TabloAdi ne alaka dedirtecek bir isim bulunuyor ise bu sisteminizin patlamasına sebep olur. Zaten schema isiminde değişiklik yoksa hatayı farklı yerlerde arayın. Çözüme gelecek olursak;

SQL Management Studio'yu açarak değiştirmek istediğimiz veritabanında bir kaç sorgu çalıştıracağız.

İlgili menüden New Query 

ALTER SCHEMA dbo TRANSFER user.TabloAdi

Sorgusunu execute ettiğimiz zaman değişikliğin gerçekleştiğini göreceğiz. Umarım yararlı olur. İyi çalışmalar.


ASP.NET MVC _Layout CSS Menü Active

Bir önce ki yazımda klasik ASP.NET'de bu işlemin nasıl gerçekleştirildiğini sizlere anlatmıştım. Sanırım ihtiyaç doğrultusunda bunlar araştırılıyor fakat tam olarak kodlara hakim olunmadığı zaman bu tarz arayışlara giriliyor. Bu konu ile ilgili Türkçe kaynak mevcut değil. 

ASP.NET MVC ile eğer bir proje geliştiriyor ve _Layout (ASP.NET'de ki Master.Page) yapısını kullanıyorsanız ihtiyaç duyacağınızı düşünüyorum. Hazırlamış olduğunuz web sitelerinin menülerinde ki farklılığı kullanıcılara rahatlıkla yansıtabilirsiniz. Bu işlem oldukça basit gerçekleşiyor. Kullanıcı menüye tıklıyor ve o anda seçili olan menü elamanı diğerlerinden biraz daha farklı görünmesini sağlıyor. Bu da kullanıcının şuan o sayfada olduğunu göstermek için. Bkz:

Şimdi gelelim bu işlemi en basit nasıl gerçekleştiririz. MVC'nin bize sunmuş olduğu kolaylıklarla bu işlemi oldukça basit bir şekilde gerçekleştireceğiz. MVC Helpers işimizi oldukça kolaylaştıracak. Bu konuyu detaylıca bu adresten inceleyebilirsiniz. 

Öncelikle Solution Explorer penceresinden Projemize sağ tıklayarak yeni bir klasör oluşturuyoruz. Ben ismini Helpers yaptım.

Daha sonra oluşturduğumuz klasör üzerine sağ tıklayarak Add > New Item > Class ekliyoruz. İsmini'de HtmlHelpers.cs yapıyoruz.

Kodları aynen bu şekilde yazıyoruz. 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MVCProject.Helpers
{
    public static class HtmlHelpers
    {
        public static string ActivePage(this HtmlHelper helper, string controller, string action)
        {
            string classValue = "";
            string currentController = helper.ViewContext.Controller.ValueProvider.GetValue("controller").RawValue.ToString();
            string currentAction = helper.ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString();
            if (currentController == controller && currentAction == action)
            {
                classValue = "active";
            }
            return classValue;
        }
    }
}
Daha sonra _Layout sayfamıza gelerek. Sayfamızın en başına oluşturduğumuz Helpers'ı ekliyoruz. 
@using MVCProject.Helpers; //MVCProject benim projemin ismi.
_Layout sayfasında ki menü kodlarına gelerek gerekli eklemeleri tamamlıyoruz.
<ul class="topnav">
   <li><a href="/Home/Index" class="@Html.ActivePage("Home","Index")">Anasayfa</a></li>
   <li><a href="/Home/About" class="@Html.ActivePage("Home","About")">Hakkımızda</a></li>
   <li><a href="/Home/Contact" class="@Html.ActivePage("Home","Contact")">İletişim</a></li>
</ul>

Menü kodumuzun içinde ki class="active" kodunu kullanmaktansa her menü elemanının class'ına @Html.ActivePage("Home","Index") kod parçacığını yazıyoruz. Böylece kullanıcı hangi sayfada geziniyor iste o sayfanın class'ını active olarak ekliyor. Diğer class'lar boş kalacaktır. 

@Html.ActivePage("Controller Adı","Action Adı") Burada ki ActivePage ise Helpers içinde oluşturmuş olduğumuz sınıf.

Umarım faydalı olmuştur.