efcore icon indicating copy to clipboard operation
efcore copied to clipboard

Ability to define custom joins

Open domagojmedo opened this issue 1 year ago • 7 comments

Not sure if it's currently possible, but would be nice to be able to define a "custom join" maybe. Say we have a table Metadata and that table has PK Id and columns RowId, TableName and Data. We also have tables Blog and Post.

In RowId we write down PK of the table with name in TableName. It would then be nice if we could explain to EF how to join from our tables Blog and Post to table Metadata.

If we have List<Metadata> Metadatas in Blog, we should be able to define in ModelBuilder that when we access Blog.Metadatas it would join by Blog.Id = Metadata.RowId and Metadata.TableName = 'Blog'.

I guess there is an issue with what happens if you want to add a Metadata entity to Metadatas list on Blog or Post 🤷

domagojmedo avatar Feb 27 '24 12:02 domagojmedo

@domagojmedo why have TableName on Metadata in the first place? Blog (and presumably Post) already reference a specific Metadata.RowId via the foreign key, what's the purpose of having Metadata.TableName = 'Blog'? Is the idea to allow multiple rows with the same RowId but different TableNames?

roji avatar Feb 27 '24 15:02 roji

Yes yes, RowId isn't really FK, it can reference many tables depending on TableName column

domagojmedo avatar Feb 27 '24 15:02 domagojmedo

To avoid having N FK columns on the table, 1 for each table that can have a row in metadata table, we have this kind of "soft" foreign key

domagojmedo avatar Feb 27 '24 15:02 domagojmedo

But why not just reference Metadata.Id directly from a Blog.MetadataId foreign key (and similarly from Post.MetadataId)? That allows a very simple, classical one-to-many relationship, where each Blog/Post just references its Metadata row?

roji avatar Feb 27 '24 16:02 roji

But 1 blog can have many Metadata associated with it. It's 1 to N from the other side.

Another example is an audit table where you save a json diff of row when it's updated. You can have many updates for the same row

domagojmedo avatar Feb 27 '24 16:02 domagojmedo

duplicate of https://github.com/dotnet/efcore/issues/7623?

MoishyS avatar May 08 '24 19:05 MoishyS

@MoishyS No, while there is some overlap in scenarios the implementation would likely be very different

AndriySvyryd avatar May 08 '24 19:05 AndriySvyryd