2016-03-27 14 views
1

Ich habe eine Tabelle, die eine abstrakte Klasse entworfenDefinieren Sie ein Feld als geschütztes Eigentum

namespace Test.Data 
{ 
    [Table("Parameter")] 
    public abstract class Parameter 
    { 
     [StringLength(200)] 
     protected string title { get; set; } 

     protected decimal? num { get; set; } 

     public Int16 sts { get; set; } 

    } 
} 

und einige Klassen von ihm verlängert haben (TPH) Ich fand, dass, wenn Eigenschaften wie PROTECTED definiert, werden sie erzeugen nicht in Datenbank und sie sollten öffentlich sein (oben sind andere st geschützt). Aber ich mag die oben genannten Eigenschaften aus einem anderen Namensraum verstecken und mit verschiedenen Namen für sie, wie:

namespace Test.Data 
    { 
     public class Measure:Parameter 
     { 
      [NotMapped] 
      public string Title { get { return ttl; } set { ttl = value; } } 
     } 
    } 

    namsespace Test.Model 
    { 
     public class MeasureModel:Data.Measure 
     { 
      public void AddNew() 
      { 
       var m = new Data.Measure(); 
       m.Title="meter"; //other measure's properties shouldn't accessable here   
      } 
     } 
    } 
+0

Intern kann Ihnen helfen – ahmedsafan86

+0

Mögliches Duplikat von [So ordnen Sie eine geschützte Eigenschaft in EF 4.3 zuerst zu] (http://StackOverflow.com/Questions/9311954/How-to-Map-a-Schutz-Property- in-ef-4-3-code-first) – poke

+0

@poke, EF optimiert jedes Jahr und jetzt Tage sprechen wir über seine 6.x – Hamid

Antwort

2

Eine einfache Lösung wäre, den Zugang Ausdrücke zu verwenden, anstatt:

namespace Test.Data 
{ 
    [Table("Parameter")] 
    public partial abstract class Parameter 
    { 
     [StringLength(200)] 
     protected string title { get; set; } 

     protected decimal? num { get; set; } 

     public Int16 sts { get; set; } 

    } 
} 

namespace Test.Data 
{ 
    public partial abstract class Parameter 
    { 
     public class PropertyAccessExpressions 
     { 
      public static readonly Expression<Func<Parameter, string>> Title = x => x.title; 
     } 
    } 
} 

In Abbildung Sie gehen für so etwas wie folgt aus:

.Property(Test.DataParameter.PropertyAccessExpressions.ID); 

Weiterführende Literatur:

http://blog.cincura.net/232731-mapping-private-protected-properties-in-entity-framework-4-x-code-first/