Let me say upfront that databases are not my area of expertise, so I may be saying something that is obviously wrong at first glance. (Apologies for wasting your time if this will turn out to be the case.) Secondly, this behaviour seems to be related to development a little more than users, thus posting here.
The Problem
SimpleModelInspector does not recognise collections of simple values (example below) as one-to-many, while in my view such dependent collections should automatically be marked as such (as well as inverse). At first I thought that this was a glitch and aimed to write a test that would demonstrate it; however, to my surprise there are already tests proving the opposite behaviour!
The tests in question are WhenCollectionOfComponentsThenNoMatch and WhenCollectionOfElementsThenNoMatch inside OneToManyTests. To my (untrained) eye it seems they should be demonstrating that a collection of components and a collection of elements should in fact be marked as one-to-many (which it is currently not).
Why?
The particular use case in case you're wondering: having cascade-on-delete enabled on collections inside auto-mapped classes:
public MyClass
{
public IList<string> Tags { get; set; }
}
public class MyModelMapper : ModelMapper
{
public MyModelMapper() : this(new SimpleModelInspector())
{
}
public MyModelMapper(IModelInspector modelInspector) : base(modelInspector)
{
BeforeMapList += CascadeDeleteForChildCollections;
}
private void CascadeDeleteForChildCollections(
IModelInspector inspector,
PropertyPath member,
ICollectionPropertiesMapper customizer)
{
if (inspector.IsOneToMany(member.LocalMember))
{
customizer.Inverse(true):
customizer.Key(k => k.OnDelete(OnDeleteAction.Cascade));
}
}
}
(I know it is not always the best+safest idea to casdade, but in this case these are some utility tables, and not part of the core business domain.)
Please do let me know if I'm wrong and this in fact is not a classic example of a one-to-many relationship, or if there perhaps exists another way to detect such collections with a model inspector and/or have them auto-SQL-cascade their deletes.
Best regards,
Dawid Ciecierski