2011-01-21 39 views
5

Otomatik artışlı bir sütuna sahip olduğumuzda, yani EF üzerinden SET IDENTITY_INSERT davranışını kullandığımızda EF'deki yeni bir varlığın kimlik değerini zorlamak için bir yol var mı?Varlık Çerçevesi SET IDENTITY_INSERT

Gereksinimimiz, form formumuzun her zaman doldurulmadan veya kaydedilmeden önce boş formda oluşturduğumuz nesne için yeni ve benzersiz bir kimlik göstermesi gerektiğidir. Fikir, bu kimliğin telefon üzerinden birine okunabilmesi ve daha sonra kullanıcının arama tamamlandıktan sonra formu tamamlayıp kaydetmesidir. Veritabanına boş bir satır ekleyerek bir kimlik ayırabiliriz ve sonra benzersiz sütunlarımız ve FK'lerimiz var; bunun yerine, güvenlik için kilitlerle arttığımız bir 'next ID' tablosu hazırladım ve bunu dikkatli olmak için nesne tablosundaki en üstteki ID'ye karşı test ediyorum. Bu fikri daha sonra, bu yeni ID'nin kullanımını geri aldığımızda kullanmak zorunda kaldık. Fakat EF'in bunu nasıl yapacağını göremiyorum.

Mümkün mü - sadece özlediğim bir şey mi? Kimliği bile bu eklenti için aşağı inanıyorum sanmıyorum, bu yüzden Save IDs etrafında SET IDENTITY_INSERT arayarak düşünmüyorum yardımcı olur. Ya da başka bir şey yapmak zorunda mıyım? Alternatifleri görebilirsiniz:

    bir kimlik olabilir ve hepsi manuel olarak kontrol değil bizim kimlik sütunu değiştir
  • : Burada bir tablo kimliği miras var yani bu çok potansiyel zordur.
  • DB kimliğini ve kullanıcı görünür kimliğini ayrı bir sütuna ekleyin ve burada benzersiz kimliğimizi kaydedin.
  • Yukarıdaki gibi kimliği ayırmak için boş satır; bazı nullabilirlik değişikliklerine ihtiyaç duyabilir ve bu kayıtları göz ardı etmek için veri okuma kodumuzu değiştirebilir.

Teşekkürler! Bu, EF4 (bir EDMX ve üretilen sınıflar POCO'lar kullanmadan) ve önemli olması durumunda SQL Server 2008'e karşıdır.

+1

Kimliğin kimliğini garanti etmenin tek yolu, 'SET IDENTITY INSERT' ile oynamak, kısıtlamalarla başa çıkmak için işlevselliği yeniden değiştirmeden önce olası kopyalarla ilgileneceğiniz gerçeği düzeltmeyecektir.Bu gerçekten sadece sıralı numaraları gerektiren bir konu mu? –

+0

@OMG Ponies Evet, belki de bundan sonra gitmenin yolu budur. Eklemek için yinelenen kimlikler kesinlikle istisnai durum olacaktır, yine de - geri beslediğimiz sıralı yeni kimlikler, kilitler vb. Ile farklı bir tabloda oluşturulmuştur, böylece işler beklenmedik bir şekilde yanlış gitmedikçe benzersiz olacaktır. – Rup

+0

Yeni değerleri kendiniz belirlerseniz - bu durumda IDENTITY özelliklerine ne ihtiyacınız var ??? –

cevap

1

Neden bir ana anahtar olarak kullanılmıyor. Otomatik artış, hiçbir eşzamanlılık yokluğu vb. Ile ilgisi yoktur. Sadece formu oluşturduğunuz anda Guid yaratırsınız. Bir arayan kişiye teslim ve sonra formu doldurun. Form iptal edildiğinde sorun olmaz. Form oluşturulan Guid ile varlık yaratmak bittiğinde uygulamak, varlık nesnesinin diğer değerlerini ayarlamak (a) alışkanlık şema değiştirmek bağlam ve SaveChanges() ...

+0

Teşekkürler. Kimlik bir insana okunmalıdır, ancak daha basit olanı daha iyidir. Bunu yeni bir sütunda (zaten çözdüğüm bir sorun) ayrı bir artırılmış numara üzerinden kullanmanın avantajını görmüyorum: Yeni değerler aramak için tüm arama + arama kodlarımızı değiştirmemiz gerekecek bunun yerine, vb. Eğer tablo birincil anahtarı kastettiyseniz, o zaman bu tabloya FKR'ler (artı bahsettiğim kimlik mirası) yani onu tamsayı olarak tutmayı tercih ediyorum - yine rastgelelikten ayrı olarak burada bir avantaj görmüyorum. – Rup

+0

Tabii ki ** NOT **, tablonuzdaki ** küme anahtarı ** olmasına izin verin - bu, veritabanınız için çok verimsiz ve çok kötü olur. –

+0

Şimdi sorunu daha açık bir şekilde görüyorum ... ID, EF tarafından oluşturulur ve birincil anahtardadır, sonradan değiştirmek mümkün değildir sanırım ... Belki de içeriği bağlamdan ayırırsanız ... Kendini Takip Eden Varlıklar ile çalışırım. Birincil anahtarda bulunan değeri değiştirmek için varlığı durdurma. Zor bir tane olsa! –

0

Alternatifler

  1. Kullanım EF İşlem

Sen context.SaveChanges çağrı() ve autoincremented birincil anahtar alabilirsiniz. İşlem tamamlandığında işlemi gerçekleştirebilirsiniz. İşlem iptal edilirse veya bir hata/istisna varsa, satırlarınızda delikler/kirli veriler olmayacak şekilde her zaman geri alabilirsiniz. İşlemi tamamlamak için hangi yöntemleri veya ekranları kullanırsanız, singleton şablonunu kullanmanızı ve aynı işlemi/bağlamı aktarmanızı öneririm.

  1. Sadece ek bir statü ekleyin: Sonra bilgilerle formu düzenlemeye devam Taslağı kaydedilen kimliği ile taslak olarak

kaydet boş formu. Tamamlandığında formu son/hazır olarak kaydedin. Formu kaydetmeye devam ederseniz, taslağı her zaman geri dönüştürebilirsiniz.