When looping through members of a Db entry, I would like to determine whether or not a particular navigation is part of a many-to-many relationship
When debugging, I can see a property collection.Metadata.ManyToManyLoader
:
Which only seems to appear on my many-to-many collections
However, I can't seem to target or select that property in my code:
var test = collection.Metadata["ManyToManyLoader"];
var test2 = collection.Metadata.FindAnnotation("ManyToManyLoader");
Both test
and test2
above are just null
, even though I can see they shouldn't be in my locals tab
What gives?
Some more code:
var entry = DbContext.Entry(entity);
foreach (var collection in entry.Collections)
{
var test = collection.Metadata["ManyToManyLoader"];
var test2 = collection.Metadata.FindAnnotation("ManyToManyLoader");
}
Starting with EF Core 5.0, the Metadata
property of collection entry is INavigationBase
. Which could be actually either INavigation
(for "regular" collection navigations) or ISkipNavigation
(for skip navigations currently used for implicit many-to-many relationships).
Hence you could check for that interface, e.g.
if (collection.Metadata is ISkipNavigation info)
{
// some additional info if needed
var declaringEntityType = info.DeclaringEntityType; // the entity containing the navigation
var targetEntityType = info.TargetEntityType; // "other side" entity
var joinEntityType = info.JoinEntityType; // join entity
var foreignKey = info.ForeignKey; // foreign key of join entity to this entity
var inverse = info.Inverse; // the navigation property of the "other side" entity
}
etc.