2011-07-20 19 views
6

EF4.1 ile MVC3 VS2010 kullanıyorum, SQL Server'ı kullanarak SQL Server'ı oluşturdum ve bunu MVC3 Web Uygulamasına aktarıyorum.Veritabanından Güncelleştirme Modeli (Veritabanı Öncelikli)

Veritabanından Güncelleştirme Modeline geldiğimde burada bir sorunum var Tüm model dosyaları değişikliklerini kaybettim, örneğin doğrulama için bazı modellerde öznitelikleri kullanıyorum veya yeni modelle üzerine yazılanların tümünü kullanıyorum özellikleri. Model bilgisini kaybetmeden Veritabanından Güncelleme Modeli var mı?

VEYA

doğrudan modelleri dosyaları kullanmak yerine benim modellerinde doğrulama tanımlamalıdır

?

cevap

10

Güncelleme: Bu hala nispeten popüler olduğu için, bunun üzerine bir blog yazısı oluşturduk.

http://jnye.co/Posts/19/adding-validation-to-models-created-by-entity-framework-database-first-c

Eğer ViewModels kullandığınız modelleri doğrulamak değil, isterseniz

, doğrulama niteliklerini tanımlamak için kısmi sınıflarını kullanın. Örneğin:

Başınızdan MetadataTypeAttribute (bu System.ComponentModel yaşayan bir kısmi sınıf oluşturmak gerekir üzerinde bir dize uzunluğu doğrulayıcı koymak ve kullanmak istiyorsa

public class User { 
    public string Name { get; set; } 
} 

gibi bir model var .DataAnnotations)

Aşağıdaki sınıflar, kendi oluşturulmuş modellerinizle aynı dosyaya koydukları kendi ayrı dosyalarında NOT tanımlanmalıdır. aşağıdaki gibi

[MetadataTypeAttribute(typeof(UserMetadata))] 
public partial class User { 
} 

Ardından UserMetadata sınıfta doğrulama tanımlamak

public class UserMetadata{ 
    [StringLength(50)] 
    public string Name {get; set;} 
} 

DÜZENLEME

Biraz daha ayrıntılı olarak çözümünü açıklayan bu yazıyı buldum http://themonitoringguy.com/tips-tricks/validating-microsoft-entity-framework-objects-c-mvc/

+0

Yani modeli ben. Sırt her dosya için gidip [MetadataTypeAttribute (typeof()] özelliğini yeniden tanımlamak zorunda Eğer @NinjaNye ederiz ama bu benim için pratik değildir rejenere her zaman. – Shadi

+0

Hayır, sadece irade Yeni bir mülk için doğrulama yapmak zorundasınız, bunu yapmak zorunda kalacaksınız.Yalnızca sınıf ve meta veri sınıfının üzerine yazılmayacak veya değiştirilemeyecek – NinjaNye

+0

Üzgünüm, biraz daha net yapmalıyım, kısmi sınıfınızı ve meta veri sınıfınızı ayrı ayrı tanımlamalıyım dosya, otomatik oluşturulan dosya içinde değil.Yalnımı – NinjaNye

1

Herhangi bir tasarımcının ilk kuralı şöyledir: Tasarımcıda herhangi bir şeyi güncellediğinizde tamamen silineceği için değiştiremeyeceğiniz bir kod üretir.

Tüm oluşturulan sınıflar kısmi olup, kendi kısmi parçanızı oluşturabilir ve özel mantığınızı buraya koyabilirsiniz. Otomatik olarak oluşturulan parçada tanımlanan özelliklere nitelikler ekleyemezsiniz. Veri ek açıklamaları durumunda, buddy classes aracılığıyla veya kod oluşturma sırasında hangi veri notunun ekleneceğine karar vermek için kendi mantığınızı içerecek özel T4 şablonu ile mümkündür. Her iki senaryo da çoğunlukla kötü bir uygulama olarak kabul edilir, çünkü bu görünüm için tam olarak gerekli olan doğrulama için görünüm başına ayrı görünüm modeline sahip olmanız gerekir.

2

Hayır, dosyalar her seferinde yeniden üretilecek.

Tüm sınıflar kısmi olarak tanımlanmıştır, böylece MetadataTypeAttribute'u kullanarak DataAnnotations öğesini kolayca ekleyebilirsiniz.

Diyelim ki aşağıdaki gibi tanımlanan bir User sınıf var diyelim:

public partial class User { 
    public string Name {get;set;} 
} 

IUser meta veri olarak kullanılacağını belirtmek için User sınıfını genişletmek sonra IUser Interface

public interface IUser { 
    [Required] 
    [DisplayName("User name")] 
    string Name {get;set;} 
} 

oluştur Ve.

[MetadataType(typeof(IUser))] 
public partial class User {} //Empty class body 
+0

Teşekkür ederim Bertand, sen ve @NinjaNye harika bir yardım sağladı – Shadi

+0

MetadataType, ara yüzü genişletmek için sadece ':' anahtar sözcüğünü kullanmaktan farklı mıdır? –

İlgili konular