2012-02-10 21 views
30

Öncelikle benim varlık çerçeveye ilk yaklaşımla etrafa oynamaya başladım, bu sayede özelliklerini benim görünümümdeki ek açıklamalarla görüntüleyebiliyorum (aksi halde, şimdi ek açıklama ekleyebileceğim ve sonra verileri bir nesneden diğerine kopyalayabilmem için benim için oluşturulan varlık çerçevesiyle neredeyse aynı olan bir sınıf oluşturun.Varlık Çerçevesini değiştirmeden veritabanını durdurma

Uygulamamı başlattığımda bir veritabanı oluşturmaya çalışıyor gibi görünüyor.

Veritabanı çerçevemi değiştirmek için varlık çerçevesini hiç istemiyorum. Hayır. Hiç değil. Denemeye bile gerek yok. Veritabanlarını değiştirmek gerçekten zor değil; Bunu kendim yaparsam çok daha rahat hissederdim. Veritabanını tasarlarken elimi tutmak için bir çerçeveye ihtiyacım yok.

Veritabanımı değiştirmeyi denemeyi durdurmak için çerçeveye söyleyebilir miyim? Veritabanımı değiştirmeye çalıştığı gerçeği oldukça korkutucu olduğu için ilk önce kod kullanmaktan çekiniyorum. Gelişimde bile hiç bir zaman olmasını görmek istemiyorum.

Şansım tükendi mi?

+1

bakınız.Veritabanınızın bir kopyasını kullanmayı deneyebilir ve EF'yi bu noktaya yönlendirebilirsiniz. Db'yi değiştirmeye ve farklılıkları karşılaştırmaya izin verin, ardından modelinizi buna göre değiştirin. EntityTypeConfiguration genel sınıfına da bir göz atmalısınız. –

+0

Şemayu değiştir veya verileri değiştir? – jrummell

+0

Bazılarımız sadece bu otomatik göç hareketlerine güvenmiyor ve veritabanını tasarlamanın ve kurmanın el ile yapmanın tamamen makul olduğu kadar önemli olduğu perspektifinden geliyor. Ama EDMX'i benden uzaklaştırın ... Bunu yapmanın bir başka nedeni: Bir ekip DB üzerinde çalışabilirken, diğeri sınıfları/modelleri eşleştirecek şekilde kabaca paralel olabilir. Ve eğer bir şey değişirse, geçişler için tekrar aramak zorunda kalmazsınız. Sadece ek açıklamalarınızı güncelleştirin. – mmcrae

cevap

46

, veritabanı başlatıcı devre dışı bırakabilirsiniz: modeliniz tam olarak veritabanı eşleşmiyor gibi

public class SchoolDBContext: DbContext 
{ 
    public SchoolDBContext() : base("SchoolDBConnectionString") 
    {    
     //Disable initializer 
     Database.SetInitializer<SchoolDBContext>(null); 
    } 
    public DbSet<Student> Students { get; set; } 
    public DbSet<Standard> Standards { get; set; } 
} 

bu sesler http://www.entityframeworktutorial.net/code-first/turn-off-database-initialization-in-code-first.aspx

+1

Bu örnek videoda olduğu gibi, bağlam sınıfının statik yapıcısına koyabilirsiniz: http://msdn.microsoft.com/en-us/data/jj572367 –

+1

videoda gösterilmiyor. Bunun yerine bakmak: http://www.entityframeworktutorial.net/code-first/turn-off-database-initialization-in-code-first.aspx Önemli veritabanı –

+1

önünde bu kullanmak değil bu cevap geliştirilebilir bu kodu eklemek için. –

3

EF'yi kullanmak, ancak veritabanını hiçbir zaman değiştirmek istemiyorsanız, muhtemelen önce kodu istemezsiniz. Muhtemelen öncelikle veritabanı gibi bir şey daha istiyorsun. Cevap yorumlardan

http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-model-amp-database-first-walkthrough.aspx

Bağlantılar:
http://automapper.codeplex.com/
Getting Started with AutoMapper

düzenleme: golü yanlış, you should reference this answer where the following correct code was given:

If you don't want EF to create your database, you can disable the database initializer

Database.SetInitializer<MyContext>(null); 
+0

Veritabanının ilk olarak * istediğim gibi ses çıkardığını kabul ediyorum, ancak benim için üretilen modele neredeyse aynı olan bir sınıf oluşturmak zorunda kalıyorum. Neredeyse aynı bir sınıf oluşturmak zorundayım, böylece görünümümde görüntülenmek üzere ek açıklamalarla özellikleri dekore edebilirim (örneğin, doğrulamayı zorlamak). Tüm "EF" nesnelerine geçiş yapmamı ve ek açıklamaları taşıyan yeni nesneyi kopyala/haritalamamı sağlar. –

+1

Db model nesnelerini asla görünümlerinize geçirmemelisiniz. Genelde, görünümünüze yalnızca o görünüm için kullanılabilen özellikleri içeren başka bir sınıf oluşturursunuz. Daha sonra bu sınıfı sizin doğrulama özelliklerinizle dekore edersiniz –

+0

@AnthonyShaw - Bunu yapan pek çok insan örneği görmedim, ama şu anda yaptığım tam olarak bu. Bu konuda endişeli hissettim, çünkü çok fazla sıradan kopyalama/haritalama çalışması gibi görünüyordu. Veritabanı model nesnesini görünümünüzde görüntülemek üzere bir nesneye dönüştürmek için kullandığınız bir desen var mı? Bunu genellikle nasıl yapıyorsunuz? –

2

Eğer taban sınıfını kullanın Başlatıcı sen beyan: yerine

public class DatabaseInitialiser : CreateDatabaseIfNotExists<MyContext> 

:

public class DatabaseInitialiser : RecreateDatabaseIfModelChanges<MyContext> 

Yoksa kullanırsanız:

Database.SetInitializer<MyContext>(new RecreateDatabaseIfModelChanges<MyContext>); 

ile değiştirebiliyor :

Database.SetInitializer<MyContext>(new CreateDatabaseIfNotExists<MyContext>); 
1

code first, tam olarak ne anlattığınızı tam olarak yaptığından, sorunuzu anlamıyorum.

Eğer EF'in veritabanınızla çalışmasını istemiyorsanız, mevcut veritabanınızdan generate a model. Eğer EF sizin veritabanı oluşturmak için istemiyorsanız

+0

Doğru, ancak veritabanımdan bir model oluşturursam, görüntülemelerimde veri görüntülemek için ihtiyacım olan veri ek açıklamalarını kaçırıyorum. Çok fazla yinelenen çalışma ile sonuçlanır; Temel olarak, oluşturulan modelle aynı bir sınıf oluşturup bu özellikleri ek açıklamalarla dekora etmek. Bununla ilgili tüm kopyalama çabalarından kaçınmaya çalışıyorum. –

+0

Oluşturulan sınıfları, kısmi sınıflar veya arkadaş sınıfları (MetadataAttribute) oluşturarak dekore edebilirsiniz. – jrummell

+0

Kod Ikinci yapmak istediğiniz örnekler vardır, veritabanı var, ancak İlişkiler yok veya İlişkiler ile ilgili ilişkiler ve bir Kod Ikinci yaklaşım gereklidir. –

İlgili konular