Jump to content
  • 0
est.sackan

Northwind OrderDetails düzenlemesi hk.

Question

MVC derslerinde ki Sepet projesinde ürünlerin sepete eklenip daha sonra siparişin tamamlanarak Northwind de ki Orders tablosuna kayıt olarak eklenmesini sağlamıştık.

Ancak daha sonra projeye Admin Areas ekleyerek buradan Orders tablosuna kaydettiğimiz siparişleri Onaylayarak, her bir ürünün ayrı kalemler halinde OrderDetails tablosuna kaydedilmesi işleminde aşağıda ki hatayı almıştık.

https://prnt.sc/rxfond

Biraz araştırma yaparak problemin Northwind de ki OrderDetails tablosunda ki çok a çok bağlantıdan kaynaklandığını öğrendim.(Teorim yanlış da olabilir tabi 🙂)

Çünkü tabloya özel bir ID bulunmazken, OrderID ve ProductID adında farklı tablolarda PK(Primary Key) olarak bulunan sütunlar, bu tablo da da PK olarak bulunmaktaydı.

DB de manuel olarak elle kayıt eklenebilirken, Entity Framework ortamında neden bu hatayı aldığımızı bulamadım, ancak kendi çapımda alternatif bir çözüm buldum.

Adım Adım resimli şekilde aşağıda ki adımları takip edebilirsiniz;

1. AdımNorthwind de ki OrderDetails tablosunu sağ tıklayıp siliyoruz.  https://prnt.sc/rxfgd0

Ancak bu adımda OD yi tümüyle sileceğimiz için eski kayıtlar yok olacak, isterseniz işlemden önce Northwind in Backup ını alabilirsiniz. https://prnt.sc/rxg7cy - https://prnt.sc/rxg7wp

2. Adım ) Daha sonra New Query diyerek sorgu ekranına aşağıda ki kodları copy paste ederek Execute diyerek OrderDetails tablomuzu yeniden, bu sefer yapıya daha uygun şekilde oluşturulmasını sağlıyoruz. https://prnt.sc/rxfgsv

Create Table Sorgusu:

CREATE TABLE OrderDetails
(
    OrderDetailID int PRIMARY KEY IDENTITY(1,1) NOT NULL,
    OrderID int NOT NULL,
    ProductID int NOT NULL,
    UnitPrice money NULL,
    Quantity smallint NOT NULL,
    Discount real NULL,
    OrderStateID int NOT NULL
);

 

3.Adım ) Sağ tıklayıp New Diagram https://prnt.sc/rxfh6b

4.Adım ) https://prnt.sc/rxfi1d

5.Adım ) https://prnt.sc/rxflo8

6.Adım ) 5.Adım da ki işlemleri tamamladıktan sonra projeye dönerek Models klasörü içinde ki Model1.edmx dosyasını sağ tıklayıp Siliyoruz, ardından Web.config dosyasının içinde ki <connectionStrings> satırlarını silerek, Northwind i tekrardan projeye dahil ediyoruz.

Son olarak DB yi yeniden ekledikten sonra projede ki ProductController sınıfında bulunan UnitPrice da hata alınacağı için, sadece Nullable<> ibaresinin kaldırılması yeterli olacaktır. https://prnt.sc/rxgztj

Not: Eklediğim resimler bir süre sonra prnt.sc adresinden silineceği için bu konuya .rar halinde ekliyorum.

od.rar

  • Like 1

Share this post


Link to post
Share on other sites

3 answers to this question

Recommended Posts

  • 1

Merhabalar. Çoka çok olması gereken bir tabloyu değiştirerek kendine has bir ID kolonu koymak aslında onun yapısını bozmak olduğundan dolayı aslında bu Normalizasyon açısından tercih edilmeyen bir çözümdür. Varsayılan görünümde iş akışı hata vermiyormuş gibi gözükebilir ancak siparişlerin ve satışların raporlanmasında SQL'de ciddi anlamda sorun çıkaracaktır ve yanlış raporlar oluşturacaktır. Aldığnız hatanın nedeni Composite Key olan kümedeki bir yapıyı değiştirmek istediginizde Entity Framework'un bu sorguyu SQL'e göndermeyi mümkün olarak görmeyip 'ben bunu modifiye edemem Normalizasyonda bu seçenek bana veya SQL'e sunulmamış' demektir. Çözümü ise Fluent API'de composite key'e oncascade özelliği vermek veya başka bir algoritmayla Composite Key  kümesini yakalayarak o kümeden herhangi bir yapıyı modifiye etmeden  sipariş detaylarını düzenlemektir. 

Eğer son söylediklerim biraz karışık geldiyse veya çok havada kaldıysa isterseniz kod örneği gönderebilirim . Veya Projenizi (Sanırım Fatih Hoca'yla yapıyorsanız  o da gönderebilir) gönderirseniz uygun şekilde düzenleyip tekrar gönderebiliriz.

İyi çalışmalar dilerim.

  • Thanks 1

Share this post


Link to post
Share on other sites
  • 1

Merhabalar  çok geç fark ettim yazdığınızı. 

Eğer N-Tier mimari modeli kullanıyorsanız DAL katmanında bulunan Context sınıfınızda override ile ezdiginiz OnModelCreating metodunun icine ilgili sorunu coka cok ilişkide yasadıgınızdan dolayı  modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();   kod örneğini entegre etmeniz OrderDetails tablosunda eğer bir düzenleme yapılacaksa burada hata alma durumunu ortadan kaldıracaktır. Tabii ki bu cascade convention'i tamamen silme durumlarında işe yarar. Ancak sanırım sizin algoritmanızda Admin onay vermeden OrderDetails tablosuna ekleme yapılmıyor. Yani aslında veriler önceden hazırlanıyor ancak ne zaman ki Admin onay verir o zaman yükleniyor veya baska bir ihtimal OrderDetails verileri ilk basta "Onay bekleyen" statüsünde geliyor ondan sonra onay verilmiş olarak degişiyor. Böyle bir durumda bir OrderDetails verisini composite key kümesinin tek bir key'inden yakalamak mümkün degildir cünkü Composite Key aslında ayrılamayan bir bütündür. Sizin karar mekanizmanızda kacınılmaz bir şekilde önceden olusturulmus veri Find metodu ile tekrar bulunup bizzat bir composite key üzerinden degiştirilmeye calısıyor. Bu gibi durumlarda modifiye etmeyi gercekten istiyorsanız many to many tablosunda composite key degiştirmek mümkün olmadıgından dolayı (ProductID hatası o yüzden cıkıyor resimde) kaldırıp tekrar belirli kurallara göre eklemek en iyi cözümdür. 

Maalesef projenizi bilmedigim icin sadece Cascade kodunu gönderebildim. Asıl cözüm yolu algoritmayı composite key'i degiştirmeden Edit yönteminden gecmektedir. Umarım acıklayıcı olabilmişimdir. İsterseniz dedigim gibi projenin hata veren halini de yollayabilirsiniz. En kısa zamanda geri dönüş yapabiliriz

Share this post


Link to post
Share on other sites
  • 0
On 30.04.2020 at 23:38, Winterex yazdı:

Merhabalar. Çoka çok olması gereken bir tabloyu değiştirerek kendine has bir ID kolonu koymak aslında onun yapısını bozmak olduğundan dolayı aslında bu Normalizasyon açısından tercih edilmeyen bir çözümdür. Varsayılan görünümde iş akışı hata vermiyormuş gibi gözükebilir ancak siparişlerin ve satışların raporlanmasında SQL'de ciddi anlamda sorun çıkaracaktır ve yanlış raporlar oluşturacaktır. Aldığnız hatanın nedeni Composite Key olan kümedeki bir yapıyı değiştirmek istediginizde Entity Framework'un bu sorguyu SQL'e göndermeyi mümkün olarak görmeyip 'ben bunu modifiye edemem Normalizasyonda bu seçenek bana veya SQL'e sunulmamış' demektir. Çözümü ise Fluent API'de composite key'e oncascade özelliği vermek veya başka bir algoritmayla Composite Key  kümesini yakalayarak o kümeden herhangi bir yapıyı modifiye etmeden  sipariş detaylarını düzenlemektir. 

Eğer son söylediklerim biraz karışık geldiyse veya çok havada kaldıysa isterseniz kod örneği gönderebilirim . Veya Projenizi (Sanırım Fatih Hoca'yla yapıyorsanız  o da gönderebilir) gönderirseniz uygun şekilde düzenleyip tekrar gönderebiliriz.

İyi çalışmalar dilerim.

Merhaba,

Cevabınız için teşekkürler, ilgili senaryo için belirttiğiniz oncascade özelliği verilmesi ile alakalı örnek kod bloğunu buradan paylaşabilirseniz aynı hatayla karşılaşan kullanıcılara katkısı olacaktır.

İyi çalışmalar.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...