2016-03-27 3 views
1

J'ai conçu une classe abstraite pour une tableDéfinir un champ comme propriété protégée

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; } 

    } 
} 

et ont certaines classes étendues de celui-ci (TPH) J'ai trouvé que lorsque les propriétés définies comme protégées, elles ne produiront pas dans base de données et ils devraient être publics (ci-dessus sont protégés d'autres sts). Mais je voudrais cacher les propriétés ci-dessus d'un autre espace de noms et en utilisant des noms différents pour eux, comme:

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

Interne peut vous aider – ahmedsafan86

+0

Copie possible de [Comment mapper une propriété protégée dans le code EF 4.3 d'abord] (http://stackoverflow.com/questions/9311954/how-to-map-a-protected-property- in-ef-4-3-code-first) – poke

+0

@poke, EF optimise chaque année et maintenant nous parlons de ses 6.x – Hamid

Répondre

2

Une solution simple serait d'utiliser des expressions d'accès à la place:

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; 
     } 
    } 
} 

Dans la cartographie vous allez quelque chose comme ceci:

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

pour en savoir plus:

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