Τι είναι
- Στο 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;
Εδώ:
- Το CreatedAt δεν υπάρχει στην κλάση User, αλλά το EF Core το παρακολουθεί στη βάση δεδομένων.
- Μπορούμε να το χρησιμοποιούμε μέσω του Entry API.
Πότε τα χρησιμοποιούμε
- Όταν θέλουμε πεδία που δεν ανήκουν στο domain model αλλά χρειάζονται για persistence.
- Για foreign keys που δεν θέλουμε να εμφανίζονται στην entity κλάση.
- Για audit fields όπως CreatedAt, UpdatedAt, DeletedAt.
- Όταν θέλουμε να κρατάμε την κλάση καθαρή χωρίς 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;
Πλεονεκτήματα:
- Απευθείας πρόσβαση από τον κώδικα, χωρίς shadow property API.
- Το μοντέλο παραμένει σαφές και κατανοητό.
- Δεν χρειάζεται casting ή αναζήτηση property μέσω Entry.
Μειονέκτημα του shadow property:
- Χρησιμοποιείται όταν θέλεις να κρατήσεις την entity απογυμνωμένη και να μην εμφανίζονται πεδία στο domain model.
- Διαφορετικά, για audit fields ή foreign keys, το απλό property είναι πιο ευανάγνωστο και ασφαλές.
30 Ερωτήσεις για .NET Senior Developer
nikosst
Top comments (0)