This topic is mainly focused on performing CRUD operations using entity framework at runtime. That is, we can choose to which Table/DbSet we can CRUD data.
Prerequisite
Lets create a DbContext MyDbContext
with 2 DbSets Animals
and Birds
.
public class MyDbContext : DbContext { public DbSet<Animal> Animals { get; set; } public DbSet<Bird> Birds { get; set; } } public class Animal : LivingThing { public int NumberOfTeeths { get; set; } public int RunningSpeed { get; set; } } public class Bird : LivingThing { public int MaxFlyingDistance { get; set; } public int IsHerbivorous { get; set; } } public class LivingThing { public int Id { get; set; } public string Name { get; set; } }
Create
- To create an instance of a
Animal
orBird
entity. First get access to theDbSet<>
by its name. Then take the firstType
from its generic arguments.
var entityType = _dbContext.GetType().GetProperty("Animals").PropertyType.GetGenericArguments().FirstOrDefault(); object livingThing = Activator.CreateInstance(entityType) as LivingThing;
-
Activator
can be used to create an instance of a given 'Type'. - Now you can set commonly available properties such as
Id
andName
directly and properties which are specific to an entity can set using reflection.
livingThing.Id = 1; livingThing.Name = "Tiger"; // Set other properties dynamically Dictionary<string, int> otherProperties = new Dictionary<string, int>() { { "NumberOfTeeths", 10 }, { "RunningSpeed", 50 }, } // This will set all the properties which are specific to a class. foreach(var prop in otherProperties.Keys) { string propertyValue = otherProperties[prop]; livingThing.GetType().GetProperty(prop).SetValue(livingThing, propertyValue); }
- Add the entity
_dbContext.Add(livingThing); _dbContext.SaveChanges();
Read
- Get the IQueryable<> property through reflection
var linqQuery = _dbContext.GetType().GetProperty("Animals").GetValue(_dbContext) as IQueryable<LivingThing>; var entity = linqQurey.Where(x => x.Id == 1).First();
Update
- Get the entity by
Id
, update properties and callSaveChanges()
to update the entity.
var linqQuery = _dbContext.GetType().GetProperty("Animals").GetValue(_dbContext) as IQueryable<LivingThing>; var entity = linqQurey.AsTracking().Where(x => x.Id == 1).First(); entity.Name = "New Name"; ... ... _dbContext.SaveChanges();
Delete
- Get the entity by
Id
. UseRemove()
to delete the entity.
var linqQuery = _dbContext.GetType().GetProperty("Animals").GetValue(_dbContext) as IQueryable<LivingThing>; var entity = linqQurey.AsTracking().Where(x => x.Id == 1).First(); _dbContext.Remove(entity); _dbContext.SaveChanges();
Thanks for reading...
Top comments (0)