2011-10-01 13 views
18

मैं ईएफ 4.1 का उपयोग कर रहा हूं और एनम समर्थन की कमी के लिए एक अच्छा कामकाज की तलाश में था। Int की एक बैकिंग संपत्ति तार्किक लगती है।मैपिंग निजी संपत्ति इकाई ढांचे कोड पहले

[Required] 
    public VenueType Type 
    { 
     get { return (VenueType) TypeId; } 
     set { TypeId = (int) value; } 
    } 

    private int TypeId { get; set; } 

लेकिन मैं इस संपत्ति को निजी कैसे बना सकता हूं और अभी भी इसे मानचित्र बना सकता हूं। दूसरे शब्दों में:

मैं ईएफ 4.1 कोड का उपयोग कर किसी निजी संपत्ति को कैसे मैप कर सकता हूं?

+0

मैं जोड़ सकता हूं कि ईएफ निजी सेटर्स का समर्थन करता है, इसलिए कम से कम आप टाइप टाइप को रोक सकते हैं अपनी कक्षा के बाहर से ईआईडी। –

उत्तर

10

आप पहले ईएफ कोड में निजी संपत्तियों को मानचित्र नहीं बना सकते हैं। आप इसे protected में बदलने और EntityConfiguration से विरासत में प्राप्त कक्षा में इसे कॉन्फ़िगर करने का प्रयास कर सकते हैं।
संपादित
अब यह बदल गया है, यहाँ एक सम्मेलन आप एफई में उपयोग कर सकते हैं 6 + चयनित गैर सरकारी संपत्तियों को मैप करने के लिए इस https://stackoverflow.com/a/13810766/861716

+16

टाइम्स वे एक-चेंगिन हैं - यह अब संभव है, http://stackoverflow.com/a/13810766/861716 –

+0

@ गर्ट की टिप्पणी के अलावा, मैंने अनुभव किया है कि ईएफ 5 में निजी निजी सेटर्स के साथ सार्वजनिक गुण सही तरीके से मानचित्र हैं डिफ़ॉल्ट कोड पहले सम्मेलनों के साथ। –

64

देखें (सिर्फ एक संपत्ति के लिए [Column] विशेषता जोड़) है।

आपके मामले में, आप के लिए TypeId को बदल देंगे:

[Column] 
    private int TypeId { get; set; } 

अपने DbContext.OnModelCreating में, आप सम्मेलन रजिस्टर करने के लिए की आवश्यकता होगी:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Add(new NonPublicColumnAttributeConvention()); 
    } 

अंत में, यहाँ सम्मेलन है:

/// <summary> 
/// Convention to support binding private or protected properties to EF columns. 
/// </summary> 
public sealed class NonPublicColumnAttributeConvention : Convention 
{ 

    public NonPublicColumnAttributeConvention() 
    { 
     Types().Having(NonPublicProperties) 
       .Configure((config, properties) => 
          { 
           foreach (PropertyInfo prop in properties) 
           { 
            config.Property(prop); 
           } 
          }); 
    } 

    private IEnumerable<PropertyInfo> NonPublicProperties(Type type) 
    { 
     var matchingProperties = type.GetProperties(BindingFlags.SetProperty | BindingFlags.GetProperty | BindingFlags.NonPublic | BindingFlags.Instance) 
            .Where(propInfo => propInfo.GetCustomAttributes(typeof(ColumnAttribute), true).Length > 0) 
            .ToArray(); 
     return matchingProperties.Length == 0 ? null : matchingProperties; 
    } 
} 
+2

यह "कॉलम" विशेषता कहां से आती है? क्या यह एक कस्टम विशेषता है जिसे आपने बनाया है या यह ईएफ से कुछ आ रहा है? – Gimly

+0

यह ईएफ द्वारा उपयोग की जाने वाली मानक विशेषता है, लेकिन ईएफ lib में नहीं: System.ComponentModel.DataAnnotations.Schema.ColumnAttribute, जो System.ComponentModel.DataAnnotations.dll में है। – crimbo

+3

इच्छा है कि मैं आपको लगभग 10 अपवॉट दे सकता हूं। मुझे समय का एक गुच्छा बचाया –

3

एक और कामकाज आपके क्षेत्र को आंतरिक के रूप में सेट करना हो सकता है:

[NotMapped] 
    public dynamic FacebookMetadata { 
     get 
     { 
      return JObject.Parse(this.FacebookMetadataDb); 
     } 
     set 
     { 
      this.FacebookMetadataDb = JsonConvert.SerializeObject(value); 
     } 
    } 

    ///this one 
    internal string FacebookMetadataDb { get; set; } 

और टूर मॉडल में जोड़ें:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.ManyToManyCascadeDeleteConvention>(); 

     ///here 
     modelBuilder.Entity<FacebookPage>().Property(p => p.FacebookMetadataDb); 

     base.OnModelCreating(modelBuilder); 
    } 
+0

यह क्या अच्छा है: 'modelbuilder.Conventions.Remove (); '? – urig

+1

यह एक उदाहरण है, प्रासंगिक रेखा // // है। –

0

ऊपर (https://stackoverflow.com/a/21686896/3264286) का विस्तार @ crimbo का जवाब है, यहाँ मेरी निजी टिककर खेल के साथ सार्वजनिक गुण शामिल करने के लिए परिवर्तन है:

private IEnumerable<PropertyInfo> NonPublicProperties(Type type) 
{ 
    var matchingProperties = type.GetProperties(BindingFlags.SetProperty | BindingFlags.GetProperty | BindingFlags.NonPublic | BindingFlags.Instance) 
           .Where(propInfo => propInfo.GetCustomAttributes(typeof(ColumnAttribute), true).Length > 0) 
           .Union(
             type.GetProperties(BindingFlags.SetProperty | BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance) 
              .Where(propInfo => propInfo.GetCustomAttributes(typeof(ColumnAttribute), true).Length > 0 
                   && propInfo.GetGetMethod().IsNull()) 
           ) 
           .ToArray(); 
    return matchingProperties.Length == 0 ? null : matchingProperties; 
} 
0

एक और तरीका है इसे संभालने के लिए एक कस्टम इकाई कॉन्फ़िगरेशन को परिभाषित करना है और उसके लिए बाध्यकारी जोड़ना है।

अपनी कक्षा में एक वर्ग है कि (यह System.Data.Entity.ModelConfiguration में पाया जा सकता)

public partial class Report : Entity<int> 
    { 
     //Has to be a property 
     private string _Tags {get; set;} 

     [NotMapped] 
     public string[] Tags 
     { 
      get => _Tags == null ? null : JsonConvert.DeserializeObject<string[]>(_Tags); 
      set => _Tags = JsonConvert.SerializeObject(value); 
     } 

     [MaxLength(100)] 
     public string Name { get; set; } 

     [MaxLength(250)] 
     public string Summary { get; set; } 

     public string JsonData { get; set; } 

     public class ReportConfiguration: EntityTypeConfiguration<Report> 
     { 
      public ReportConfiguration() 
      { 
       Property(p => p._tags).HasColumnName("Tags"); 
      } 
     } 
    } 

अपने संदर्भ में EntityTypeConfiguration से विरासत निम्नलिखित जोड़ें:

using Models.ReportBuilder; 
public partial class ReportBuilderContext:DbContext 
{ 
    public DbSet<Report> Reports { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new Report.ReportConfiguration()); 
     base.OnModelCreating(modelBuilder); 
    } 
} 

विश मैं कह सकता था कि मैंने इसे अपने आप पाया, लेकिन मैंने यहां पर ठोकर खाई: https://romiller.com/2012/10/01/mapping-to-private-properties-with-code-first/

संबंधित मुद्दे