Bir önceki makalemizde bir veritabanı modelini Entity Framework ile Database-First tekniğini kullanarak uygulamamıza dahil etmiştik. Bugün ise Insert, Update ve Delete işlemlerinin nasıl yapıldığını inceleyeceğiz. Data okuma işlemleri ile ilgili detaylı incelemeyi LINQ metotları başlığında ele almıştık.
EntityCrud adında bir veri tabanı oluşturarak içerisine Personel ve Departman adında iki tablo ekleyerek aralarındaki ilişkiyi belirtelim.
CREATE DATABASE EntityCRUD
USE EntityCRUD
CREATE TABLE Personel
(
Id INT PRIMARY KEY IDENTITY(1,1),
Ad NVARCHAR(30) NOT NULL,
Soyad NVARCHAR(30) NOT NULL,
Maas DECIMAL(10,3) NOT NULL,
DepartmanId INT NOT NULL
)
CREATE TABLE Departman
(
Id INT PRIMARY KEY IDENTITY(1,1),
DepartmanAd NVARCHAR(50) NOT NULL
)
ALTER TABLE Personel
ADD CONSTRAINT FK_Personel_Departman FOREIGN KEY(DepartmanId)
REFERENCES Departman(Id)
Bir Console uygulaması açalım. Daha sonra da oluşturduğumuz veri tabanını modelini uygulamamıza ekleyelim. Nasıl ekleyeceğimiz ile ilgili detaylı bilgileri bir önceki makalemizde bulabilirsiniz. Modelimizi ekledikten sonra Insert, select, update ve delete işlemlerini ayrı ayrı ele almaya çalışalım.
INSERT
Oluşturduğumuz Personel ve Departman tablolarında şuan hiçbir kayıt bulunmamaktadır. Uygulamamızdaki context nesnemiz üzerinden bu işlemi gerçekleştiriyor olacağız. Veritabanı modelini uygulamamıza dahil ettiğimizde Personel ve Departman adında 2 adet sınıf oluşturulmuştur. Bunlara entity sınıflar denir ve veri tabanı içerisindeki tablolaları temsil etmektedirler. Yapmamız gereken işlem son derece basit, bu sınıfların nesne örneklerini yaratarak context nesnesi yardımı ile kolayca insert yapabilme şansına sahibiz.
static void Main(string[] args)
{
EntityCRUDEntities context = new EntityCRUDEntities();
Departman dep = new Departman { DepartmanAd = "IT" };
context.AddToDepartman(dep);
context.SaveChanges();
}
Management Studio ile Departman tablosundaki dataları görüntülediğimizde IT adına sahip departmanın eklendiğini göreceğiz.
Şimdi de bu departmana sahip bir Persoenel ekleyelim.
EntityCRUDEntities context = new EntityCRUDEntities();
Personel pers = new Personel
{
Ad = "Onur",
Soyad = "Salkaya",
Maas = 1000,
DepartmanId = context.Departman.First(dep => dep.DepartmanAd == "IT").Id
};
context.AddToPersonel(pers);
context.SaveChanges();
Bir personel nesnesi üzerinden departman ekleyebilmemiz de mümkündür.
static void Main(string[] args)
{
EntityCRUDEntities context = new EntityCRUDEntities();
Departman dep = new Departman { DepartmanAd = "Muhasebe" };
Personel pers = new Personel
{
Ad = "Ali",
Soyad = "Veli",
Maas = 1500,
Departman = dep
};
context.AddToPersonel(pers);
context.SaveChanges();
}
Eklediğimiz Personel nesnesi üzerinde bir Departman nesnesi de mevcuttur. Dikkat ederseniz herhangi bir Departman eklemedik. Bu personel üzerinden yaptığımız işlemde Entity Framework departmanı da insert etmektedir.
UPDATE
Update işlemi yapmak , ilgili veri tabanı kaydını ram’e çıkarıp, bağlı olduğu property’e değer atayarak SaveChange() metodunu çalıştırmak demektir. Onur adlı personelin maaşını 2000 yapalım.
static void Main(string[] args)
{
EntityCRUDEntities context = new EntityCRUDEntities();
//Personel pers = context.Personel.FirstOrDefault(p => p.Ad == "Onur");
Personel pers = context.Personel.FirstOrDefault(p => p.Id == 1);
pers.Maas = 2000;
context.SaveChanges();
}
Bu personel üzerinden, bağlı olduğu departman kaydını da update edebilmemiz mümkündür. Onur adlı personel şu anda 1 numaralı departmana bağlı. Bu departmanın adı şu anda “IT”. pers nesnesi üzerinden update işlemi yaparak 1 numaralı departman adının “Pazarlama” olmasını sağlayalım.
static void Main(string[] args)
{
EntityCRUDEntities context = new EntityCRUDEntities();
Personel pers = context.Personel.FirstOrDefault(p => p.Id == 1);
pers.Departman.DepartmanAd = "Pazarlama";
context.SaveChanges();
}
DELETE
Update işleminde olduğu gibi silmek istediğimiz kaydı ram’e çıkarırız. Daha sonra DeleteObject metoduna parametre olarak vererek SaveChange metodunu çağırırız.
static void Main(string[] args)
{
EntityCRUDEntities context = new EntityCRUDEntities();
Personel pers = context.Personel.FirstOrDefault(p => p.Id == 2);
context.DeleteObject(pers);
context.SaveChanges();
}
Artık Personel tablomuzda adı Ali Veli olan ve 2 numaralı kaydı göremeyeceğiz.
12 yorum:
Merhabalar,
C#'ı öğrenmekteyim ve şu an veritabanı yönetim için hangi yapıyı kullanmam gerektiği noktasında kararsızlık içerisindeyim;
1.klasik commandlar, execute gibi yöntemleri incelerken(öğrenirken) tamam buldum derken,
2. Dataset ve Adapterleri gördüm ilkine göre daha mantıklı geldi ve ona yöneldim, derken
3. Entity yapıyı(Linq...) gördüm ve biran hepsini boş vermeliyim ve bu konuya yönelmeliyim dedim içimden.
Şimdi size sorarım;
çoğu kez veritabanları ile uğraşmak şartıyla C# içerisinde hangi yapıyı tercih etmeliyim.
İsmail KAYA
Teşekkürler.
Merhabalar,
Genel mantığı anlamak açısından ilk olarak klasik SqlConnection, SqlCommand gibi nesneler ile birkaç demo yapmakta fayda var. Çünkü öğrenme aşamasında bu tarz demolar yapmak işin mantığını kavramak için önemli. Ancak günümüz teknolojisinde Entity Framework gibi, NHibernate gibi, Linq to Sql gibi ORM araçları mevcut ve bunları kullanmak hem kod anlamında hem de yönetimsel anlamında işimizi fazlası ile kolaylaştırmakta. Ancak direk olarak context nesnesi üzerinden gitmek bazı şeylerin havada kalmasına sebep olabilir, işte bu sebepten dolayı başlangıçta uzun yol hakkında fikir sahibi olmanın, arka planda ne gibi işler döndüğünü daha net anlamak açısından faydalı olduğunu düşünüyorum. Size tavsiyem yukarıda maddelediğiniz sırayı takip etmeniz. 1. ve 2. maddelerde fazla vakit harcamadan, veri tabanından data çekerken hangi adımları izlediğiniz konusunda manuel olarak kodlama yaparak fikir sahibi olabilirsiniz. Daha sonrasında ise tabiki de ORM araçlarından birini kullanarak entity kavramı doğrultusunda ilerlemenizi tavsiye ederim. Bu aşamada da LINQ kavramı ile karşılaşacaksınız. Bu konuyu daha net anlamak için de delegate, anonim metot, extension metot, foreach iterasyonu, yield operatörü, lambda operatörü kavramlarını araştırmanızı öneririm. Başarılar..
Teşekkürler.
public override void Insert(MusteriE instance)
{
dataBase.AddToMusteri(new Musteri
{ KisiTip = instance.KisiTip_Id });
dataBase.SaveChanges();
}
Merhaba benim benzer bir uygulamamda fk ile bağlı olan satırlar hiç bir işlemde gelmiyor. yukarıdaki örnekte KisiTip tablomdaki Id ile Musteri tablomdaki KisiTip_Id fk ile bağlı. fakat ekleme işlemi yaparken direk KisiTip diye geliyor. bu hatayı nasıl düzeltebilirim? (veritabanımı her açıdan gözden geçirdim bi hata bulamadım)
Merhaba,
Tablo ve sınıf yapılarınızı tam olarak anladığımı söyleyemeyeceğim. Ancak, KisiTip tipi bir entity durumunda gözüküyor ve siz buna KisiTip_Id (muhtemelen tipi int ya da guid olmalı) atamaya çalışıyorsunuz. instance.KisiTip_Id dediğiniz property'den bir id değeri gelecek, dolayısı ile bunu new Musteri diye oluşturduğunuz yeni Musteri nesnesinin KisiTip_Id değerine atamanız lazım.
Eğer doğru anladıysam kodu aşağıdaki gibi değiştirebilirsiniz.
dataBase.AddToMusteri(new Musteri
{
KisiTip_Id = instance.KisiTip_Id
});
dataBase.SaveChanges();
Ayrıca, zaten parametre olarak Musteri tipinden bir nesne geliyor ve instance.KisiTip_Id şeklinde data çektiğinize göre bu alan da dolu geliyor olmalı.(MusteriE ile Musteri'nin aynı tip olduğunu düşünerek) Dolayısı ile direkt olarak aşağıdaki gibi de yazabilirsiniz.
dataBase.AddToMusteri(instance);
dataBase.SaveChanges();
yapılabilir.
Şöyle açıklayayım benim Musteri ve KisiTip tablolarını içeren msSql de oluşturduğum veritabanım var. Katmanlı mimari kullanarak hazırladığım projemde repository katmanındayım. ayrıca bir de entity katmanım var ve bu katmanda MusteriE ve KisiTipE gibi class larım var. bu class larda tanımladığım property'ler de veritabanımdaki sutun isimlerimle aynı(ör:KisiTip_Id). Yani veritabanımdaki Musteri tipinden instance alıp onun KisiTip_Id'sini, entity katmanımdaki KisiTipE'den aldığım instance'nin KisiTip_Id'sine eşitlicem. Ama bunlar { açtığımda intellisense'te geliyor, manuel yazmam söz konusu değil. Garip olan şu ki: { açtığımda database'imde foreign key ile bağlı olmayan kısımlara erişebiliyorum ama fk ile bağlı olanların direk tipine erişiyorum kendine değil.
Merhabalar,
Bu tarz durumlarda uzaktan yorum yapmak çok zor malaesef..
Eğer tablo yapıları ve ilişkiler bahsettiğiniz gibi ise, Musteri tablosunda KisiTip_Id diye bir kolon varsa ve siz bu tabloyu model olarak projenize eklemişseniz, mutlaka KisiTip_Id adında bir property oluşmalı. Şu duruma göre ,
Musteri m = new Musteri();
m.KisiTip_Id = 1 ;
diyemiyor olmanız lazım. Çünkü Musteri sınıfında KisiTip_Id adında bir property yok gözüküyor ve dolayısı ile intellisence'de yardımcı olmuyor. Bence veri tabanınızı değil de oluşturduğunuz data modeli(solution içerisindeki edmx uzantılı dosya) incelemenizde fayda var. En basitinden, Musteri tipine Go to Definition diyerek ilgili property'nin var olup olmadığını kontrol edebilirsiniz.
Evet dediğinizi yaptım ve edmx dosyasının altındaki designer.cs te intellisense'te göremediğim dosyalarının get setlerinin oluşmadığını gördüm
Durum tahmin ettiğimiz gibi olmuş. Modelde yer alan Musteri ve KisiTip tablolarını silerek yeniden eklemeyi deneyin, muhtemelen probleminiz çözülecektir.
Problemin neyden kaynaklandığını buldum :) projeme web service eklemek için .Net Framework 3.5 ile katman oluşturmuştum. Ve Repository katmanımı da 4.0 yapmadan oluşturunca data model eklediğimde bu katmana bahsettiğim hatayı veriyormuş.. =)
Hatanın çözülmesine sevindim, versiyon değişiklikleri bazen can sıkabiliyor malesef.
İyi çalışmalar dilerim..
teşekkür ederim..
Yorum Gönder