2013-10-14 30 views
33

Varolan bir veritabanına yöntemini EF Code-First kullanıyorum ve veritabanımda IsActive alan var. Sorun, alanın boolean olması gerektiğinde, alanın VARCHAR olmasıdır. Veritabanı şemasını değiştiremiyorum. veritabanındaEşleme yaparken değeri dönüştürme

Örnek değer olan (yanlış) "Y" (doğru) veya "N" haritalama, yapmak da doğru/yanlış bu değerleri dönüştürmek ve benim varlık sınıfı tutmak istiyorum

boolean değeri ile.

Bu mümkün mü?

Varlık ve eşleme sınıflarım aşağıdakilerdir ancak IsActive alanını boolean olarak değiştirmek istiyorum. DÜZENLEME

public class Employee 
{ 
    public int ID { get; set; } 
    public string SSN { get; set; } 
    public string Email { get; set; } 
    public string IsActive { get; set; } 
} 

public class EmployeeMap : EntityTypeConfiguration<Employee> 
{ 
    public EmployeeMap() 
    { 
     this.ToTable("Employees"); 

     this.HasKey(t => t.ID); 

     this.Property(t => t.ID).HasColumnName("ID_Employee"); 
     this.Property(t => t.SSN).HasColumnName("sReference"); 
     this.Property(t => t.Email).HasColumnName("Email"); 
     this.Property(t => t.IsActive).HasColumnName("IsActive"); 
    } 
} 

: Bunun dışında başka çözüm buldu: https://stackoverflow.com/a/6709186/1053611

+0

ilk önce veritabanından tersine mühendislik, doğru mu? Yani sınıf çalışanınız otomatik olarak oluşturulur ve kısmi mi? –

+0

Evet, doğru, ancak bunları elle eşleştiriyorum. – Gaui

+0

Üzgünüz, mevcut bir veritabanına EF Code-First kullanıyorum. – Gaui

cevap

37

diğerleri iki özelliği gerekir, ancak sen özel özelliklerden birini yapabilirsiniz olduğunu bilmek ilginizi çekebilir işaret vardır ve yine veritabanına Haritayı:

private string isActive { get; set; } 

    [System.ComponentModel.DataAnnotations.Schema.NotMapped] 
    public bool IsActive 
    { 
     get { return isActive == "Y"; } 
     set { isActive = value ? "Y" : "N"; } 
    } 

Eğer özel mülkiyet haritaya Eğer OnModelCreating yönteminde özel bir kongre kullanabilirsiniz Ef6'yı kullanıyorsanız

modelBuilder.Types().Configure(c => 
{ 
    //NB the syntax used here will do this for all entities with a 
    //private isActive property 
    var properties = c.ClrType.GetProperties(BindingFlags.NonPublic 
              | BindingFlags.Instance) 
           .Where(p => p.Name == "isActive"); 
    foreach (var p in properties) 
     c.Property(p).HasColumnName("IsActive"); 
}); 

Referanslar:

Mapping private properties using custom conventions

Mapping private properties without custom conventions (before EF6)

Düzenleme:

: İşte

veritabanına aktarılması gerektiğini özel özelliklerini tanımlamanın başka bir yolu

İlk özel mülkiyet için sütun niteliğini ekleyin:

[System.ComponentModel.DataAnnotations.Schema.Column] 
private string isActive { get; set; } 

Sonra OnModelCreating yönteminde özel özelliklerini tanımlamak için bu özelliğe varlığını kullanın:

modelBuilder.Types().Configure(c => 
{ 
    var properties = c.ClrType 
     .GetProperties(BindingFlags.NonPublic | BindingFlags.Instance) 
     .Where(propInfo => 
      propInfo.GetCustomAttributes(typeof(ColumnAttribute), true).Length > 0); 

    foreach (var p in properties) 
     c.Property(p).HasColumnName(p.Name); 
}); 

Referans: Kullanılacak Mapping a private property with entity framework

+1

Teşekkür ederim.Özel mülkiyeti haritalayabildiğimi bilmek aniden bir ton kod kaydeder. – ProfK

+6

Bu, kamu mülkiyeti eşlenmeyeceğinden beri, "x.IsActive" gibi şeyler ile DB'ye karşı LINQ sorguları yazmanıza engel olmaz mı? – Mykroft

+2

@Mycroft Evet, öyle olurdu. Ancak, tüm veri erişim kodunuzu ayrı bir derlemede tutarsanız, 'private' yerine property 'internal' yapmayı düşünebilirsiniz. – Colin

İlgili konular