7

Veritabanı İlkesi yaklaşımında Entity Framework 5 kullanıyorum ve edmx dosyasını kullanıyorum.Temel sınıf/Varlık EntityFramework 5.0

Varlıkların çoğunun 6 ortak alanı var. CreatedAt, CreatedBy vb. Gibi alanlar. Şimdi, bazı alanları, yalnızca ortak alanlara sahip olan Varlıklar'ın IQueryable sürümlerine uygulanabilecek uzantılar olarak uyguladık. Ancak, uzantı yöntemini uygularken, T yazdığı gibi IQueryable türünden herhangi bir şekilde erişilebilir ve yalnızca T türünün her zaman bir tür olması gerektiğini tanımlayabilirim.

Bu yüzden, ortak alanları olan ve T türünü taban türü olarak tanımlayan varlıklar için temel bir sınıf verebileceğimi düşündüm. Ama öyle değil mi?

Bunu nasıl çözeceğimiz veya yukarıda açıkladığımları nasıl uygulayacağımız hakkında bir fikriniz var mı?

cevap

8

Temel sınıf oluşturma. Aşağıda gibi bir arabirimi oluşturun: Sonra

public interface IMyEntity 
{ 
    DateTime CreatedAt { get; set; } 
    string CreatedBy { get; set; } 
    // Other properties shared by your entities... 
} 

, senin Modeller böyle olacak:

[MetadataType(typeof(MyModelMetadata))] 
public partial class MyModel : IMyEntity 
{ 
    [Bind()] 
    public class MyModelMetadata 
    { 
     [Required] 
     public object MyProperty { get; set; } 

     [Required] 
     public string CreatedBy { get; set; } 
    } 
} 
+0

Teşekkür: Varlık Framework tarafından ted ardından olmayan otomatik olarak oluşturulan sınıf gibi görünecektir. Yani, edmx dosyasının dışındaki arabirimi tanımlarım. o zaman, o nesneyi bu arayüzden uygulamaya geçireceğimi söyleyeceğim. Edmx dosyasını güncellediğimde allover'ı tekrar yapmak zorunda kalacağım gibi gerekli tüm varlıkların el ile düzenlenmesi kolay değil. – Amila

+2

Otomatik olarak üretilen kodlara dokunmuyorsunuz. Kısmi sınıfların kullanılması gerekiyordu. EF'deki varlıklarınızın her biri için kısmi bir sınıf (Modeller klasörü altında) oluşturursunuz. Modelleriniz için bir Meta Veri Türü tanımlayabilirsiniz (veri açıklaması için). Güncellenen cevaba bakınız. – ataravati

+0

Evet, şu anda MetadataType kullanıyorum. Ama bunu yapmak kolay bir yol olabileceğini düşündüm, yani bir varlığa bir taban sınıfı vermek gibi, şema içinde bir arayüz vermesine izin verilse daha iyi olurdu. Her neyse, bütün varlıklar için kısmi sınıfı tanımlamak zorunda kalacağım gibi. Hızlı yardım için teşekkürler – Amila

2

ben hayranıyım: Sonra

public interface IShared 
{ 
    DateTime CreatedOn { get; set; } 
} 

public interface ISharedValidation 
{ 
    [Required] 
    DateTime CreatedOn { get; set; } 
} 


public interface IMyEntity: IShared 
{ 
    // Entity Specifics 
    string Username { get; set; } 
} 

public interface IMyEntityValidation: ISharedValidation 
{ 
    [Required] 
    string Username { get; set; } 
} 

, senin Modeller olacak bunun gibi:

[MetadataType(typeof(IMyEntityValidation))] 
public partial class MyModel : IMyEntity 
{ 
    public object CreatedOn { get; set; } 
    public string Username { get; set; } 
} 

Eğer T4 cinsindeyse hızlı tepki için Tipik

[MetadataType(typeof(IMyEntityValidation))] 
public partial class MyModel : IMyEntity 
{ 
} 

, it is not recommended to use Bind in Asp.Net MVC.