DEV Community

Shadow Properties στο EF Core

Τι είναι

  • Στο Entity Framework Core, μια Shadow Property είναι μια ιδιότητα που δεν υπάρχει στην κλάση του entity, αλλά το EF Core την δημιουργεί εσωτερικά στο μοντέλο.
  • Υπάρχει μόνο στο context και στη βάση δεδομένων, όχι στον κώδικά σου.

Χρήση:

  • Συνήθως χρησιμοποιείται για metadata, όπως ημερομηνίες δημιουργίας/τροποποίησης, foreign keys, ή άλλα πεδία που δεν θέλουμε να εμφανίζονται στην κλάση.

Παράδειγμα

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}

// Στο OnModelCreating
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
        .Property<DateTime>("CreatedAt"); // Shadow Property
}

// Χρήση
var user = new User { Name = "Alice" };
context.Add(user);
context.SaveChanges();

// Προσπέλαση της shadow property
var createdAt = context.Entry(user).Property("CreatedAt").CurrentValue;

Enter fullscreen mode Exit fullscreen mode

Εδώ:

  • Το CreatedAt δεν υπάρχει στην κλάση User, αλλά το EF Core το παρακολουθεί στη βάση δεδομένων.
  • Μπορούμε να το χρησιμοποιούμε μέσω του Entry API.

Πότε τα χρησιμοποιούμε

  1. Όταν θέλουμε πεδία που δεν ανήκουν στο domain model αλλά χρειάζονται για persistence.
  2. Για foreign keys που δεν θέλουμε να εμφανίζονται στην entity κλάση.
  3. Για audit fields όπως CreatedAt, UpdatedAt, DeletedAt.
  4. Όταν θέλουμε να κρατάμε την κλάση καθαρή χωρίς extra properties που δεν χρειάζονται στο business logic.

Σημαντικά

  • Μπορείς να τα φιλτράρεις, να τα φτιάχνεις αυτόματα (ValueGeneratedOnAdd, OnUpdate) και να τα χρησιμοποιείς σε LINQ queries.
  • Δεν βλέπεις τις shadow properties απευθείας στον κώδικα – πρέπει να χρησιμοποιήσεις το EF API.

Υπάρχει πιο καθαρός και άμεσος τρόπος για το παράδειγμα που έδειξα, χωρίς να χρειάζεται shadow property.

Αν θέλεις να κρατάς πεδία όπως CreatedAt ή UpdatedAt, μπορείς απλώς να τα προσθέσεις κανονικά στην entity κλάση σου:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedAt { get; set; }  // Κανονική property
}

// Χρήση
var user = new User { Name = "Alice", CreatedAt = DateTime.UtcNow };
context.Add(user);
context.SaveChanges();

// Άμεση πρόσβαση χωρίς Entry API
var createdAt = user.CreatedAt;

Enter fullscreen mode Exit fullscreen mode

Πλεονεκτήματα:

  • Απευθείας πρόσβαση από τον κώδικα, χωρίς shadow property API.
  • Το μοντέλο παραμένει σαφές και κατανοητό.
  • Δεν χρειάζεται casting ή αναζήτηση property μέσω Entry.

Μειονέκτημα του shadow property:

  • Χρησιμοποιείται όταν θέλεις να κρατήσεις την entity απογυμνωμένη και να μην εμφανίζονται πεδία στο domain model.
  • Διαφορετικά, για audit fields ή foreign keys, το απλό property είναι πιο ευανάγνωστο και ασφαλές.

30 Ερωτήσεις για .NET Senior Developer


nikosst

Top comments (0)