25 Stimmen

Mapping von privaten Eigenschaften mit Entity Framework Code First

Ich verwende EF 4.1 und war auf der Suche nach einem guten Workaround für das Fehlen von enum-Unterstützung. Eine Backup-Eigenschaft von int scheint logisch.

    [Erforderlich]
    public VenueType Typ
    {
        get { return (VenueType) TypId; }
        set { TypId = (int) value; }
    }

    private int TypId { get; set; }

Aber wie kann ich diese Eigenschaft privat machen und trotzdem mappen. Mit anderen Worten:

Wie kann ich eine private Eigenschaft mit EF 4.1 Code First mappen?

0voto

Delorian Punkte 330

Erweiterung von @crimbos Antwort oben (https://stackoverflow.com/a/21686896/3264286), hier ist meine Änderung, um öffentliche Eigenschaften mit privaten Gettern einzuschließen:

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

0voto

rahicks Punkte 491

Ein weiterer Weg, dies zu behandeln, besteht darin, eine benutzerdefinierte Entitätskonfiguration zu definieren und eine Bindung dafür hinzuzufügen.

Fügen Sie in Ihrer Klasse eine Klasse hinzu, die von EntityTypeConfiguration erbt (Diese befindet sich in System.Data.Entity.ModelConfiguration)

public partial class Report : Entity
    {
        //Muss eine Eigenschaft sein
        private string _Tags {get; set;}

        [NotMapped]
        public string[] Tags
        {
            get => _Tags == null ? null : JsonConvert.DeserializeObject(_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
        {
            public ReportConfiguration()
            {
                Property(p => p._tags).HasColumnName("Tags");
            }
        }
    }

Fügen Sie in Ihrem Kontext Folgendes hinzu:

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

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

Ich wünschte, ich könnte sagen, dass ich das alleine gefunden habe, aber ich bin darauf hier gestoßen: https://romiller.com/2012/10/01/mapping-to-private-properties-with-code-first/

0voto

Jonathan Ramos Punkte 1544

Wie in Ihrem Modell festgestellt, gewähren Sie Lesezugriff auf die Eigenschaft. Vielleicht möchten Sie also den Schreibzugriff blockieren und auf EF mappen, indem Sie einen privaten Setter verwenden. So.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X