and then through navigation property finding the child entity
You don’t need to do that manually, EF Core can do that for you using of of the available methods for Loading Related Data – eager, explicit or lazy. In this particular case eager loading is probably the most appropriate because it allows you to combine the first two steps (finding main entity and the associated child entity) in one with single database request.
Whatever method for finding child entity you choose, the generalization of the methods in question would be to provide the navigation property accessor expression (Expression<Func<TParent, TChild>>
), which will be enough to perform the equivalent actions of the current code.
For instance, assuming the GlazingOrGasMaterial.Id
property type is Guid
and is coming from AEIMasterBase
class, the body can be generalized as
public static void RemoveChild<TParent, TChild>(
DbContext db,
Guid parentId,
Expression<Func<TParent, TChild>> childReference // <--
)
where TParent : AEIMasterBase
where TChild : class
{
var parent = db.Set<TParent>()
.Include(childReference) // <--
.FirstOrDefault(p => p.Id == parentId);
if (parent != null)
{
var child = db.Entry(parent)
.Reference(childReference) // <--
.CurrentValue;
if (child != null)
db.Remove(child);
}
}
But now it can easily be seen that you don`t really need the parent entity, so the implementation could be simplified (and also become more efficient) as follows (the same method signature):
var child = db.Set<TParent>()
.Where(p => p.Id == parentId)
.Select(childReference) // <--
.FirstOrDefault();
if (child != null)
db.Remove(child);
In both cases, the 3 calls would be
if (requestInput.RequestType == RequestAction.EDIT)
RemoveChild(dbContext, requestInput.DataId, (GlazingOrGasMaterial m) => m.{NavigationProperty});
where m.{NavigationProperty}
is respectively m.GlazingGasMaterial
, m.GlazingComplexMaterial
and m.GlazingSimpleMaterial
CLICK HERE to find out more related problems solutions.