Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ability to define custom joins (for readonly navigations) #33171

Open
domagojmedo opened this issue Feb 27, 2024 · 7 comments
Open

Ability to define custom joins (for readonly navigations) #33171

domagojmedo opened this issue Feb 27, 2024 · 7 comments

Comments

@domagojmedo
Copy link

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 🤷

@roji
Copy link
Member

roji commented Feb 27, 2024

@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?

@domagojmedo
Copy link
Author

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

@domagojmedo
Copy link
Author

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

@roji
Copy link
Member

roji commented Feb 27, 2024

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?

@domagojmedo
Copy link
Author

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

@MoishyS
Copy link

MoishyS commented May 8, 2024

duplicate of #7623?

@AndriySvyryd
Copy link
Member

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

@AndriySvyryd AndriySvyryd changed the title Ability to define custom joins Ability to define custom joins (for readonly navigations) Oct 3, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants