Foreign key conflict ef core scaffolding - c#

The foreign key {'ClassExtId'} cannot be added to the entity type 'ClassInt' because a foreign key on the same properties already exists on entity type 'Instrument' and also targets the key {'ClassExtId'} on 'ClassExt'.
Let's say I have ClassFoo & ClassBar inheriting from ClassInt. Each one of them have a reference to the same column ClassExtId. Why is the entity framework core scaffolding (v3) complaining ?

my case is different but i got the same error too when i was trying to scaffold my existing old database. i'm, posting this answer just in case someone also had the same problem with me.
it's turn out that in my old database, some table have so many duplicate foreign key created by previous developer. you can check this in your sql server (i use sql server developer edition 2019)
In Object Explorer, right-click the table that will be on the
foreign-key side of the relationship and click Design.
The table opens in Table Designer.
From the Table Designer menu, click Relationships. you'll see all the foreign key defined for that table, in my case it was applicationID that duplicate. clean it up :
go to your table > expand it and go to Keys. delete the duplicate key there:
run your dotnet ef dbcontext scaffold command and good luck!

Related

How do you manage duplicate relationship in Entity Framework Core when working on Dynamics CRM?

I am working with Dynamics CRM and wanted to test the efficiency of entity framework core to generate the models and context for it's SQL Server database.
Using Scaffold-DbContext, I ran into this error :
The foreign key {'OwningBusinessUnit'} cannot be added to the entity type 'ActivityPointerBase' because a foreign key on the same properties already exists on entity type 'ActivityPointerBase' and also targets the key {'BusinessUnitId'} on 'BusinessUnitBase'
Quick look through the DB and found a relationship duplicated. Meaning: both foreign key constraints target the exact same foreign and primary key field.
They are perfectly identical, only the name differs.
Surely enough the Microsoft documentation shows that to be the case and I found both of these relationship mentioned.
business_unit_socialactivity
business_unit_activitypointer
I also found other such case.
Can I delete any of the two foreign key constraint (doubt it) ? If not, how do I manage this issue ?
I am using Entity Framework Core and .NET Core 3.1.25.
Is this a version issue?
If by "delete" you mean, delete the columns in the database, I would strongly advise you not do that. Typically you don't want to change the models of a system you are using unless you own the system and have a strong understanding of why it was there in the first place. If by "delete" you mean, not include one of the properties in your entity framework model, that will work until you need to update the table, which won't work at that point because the model won't know to update the missing column and may cause the data in the schema to become not well formed (e.g, missing an update to the table's column that should have happened).
Entity Framework supports having two foreign keys to the same table. You may need to set up your foreign key relationship differently. I'm guessing that the entity framework model might be reusing the same property for both foreign key relationships. If that's the case, then you need to add a second property representing the second foreign key.
It seems suspicious to me that the schema has a duplicate foreign key for the exact same purpose. I'd double check to make sure your understanding of its purpose is correct. It could be due to a refactor that Microsoft did to get a new standard name while retaining backwards compatibility in parts of their system or customer systems. If both foreign keys actually represent the same relationship (I think this is unlikely) Consider instead not specifying that both are a foreign key in the entity framework model. Specify that one is the foreign key, and don't specify that the other one is. Entity Framework will treat that as the property for navigation and join purposes, and think of the other as just a data column. Then it'll be up to you to make sure the other column is set correctly if it's changed.
If the entity framework model and configuration is being generated from a tool and you're getting this error, you may have to specify the model and configuration by hand to get the correct behavior.

Relation chanage not getting reflected in entity model

Am very new to Entity Framework. I am using vs 2012 professional 2012 for building my mvc4 app.
I will try to explain problem in my limited knowledge
I have created Ado.net entity data model. After that I have chnaged db for setting relations. After "update model from database" the relations are not gettng added to model classes. So when I run my app errors like
The relationship 'x.FK_Privileges_Module' was not loaded because the type 'x.Privilege' is not available.
is shown
How can I solve this. I even tried adding manually the relation to corresponding . cs file and still getting error for every newly added relation.
How can I solve this?
You can remove entities from model designer (Press Yes when message box will ask) and then add entities again.
Note: To delete, select entities and press delete key
The edmx is not able to find a Primary Key on Privilege and therefore the foregin key is not valid.
Add a Primary Key on Privilege

Foreign key contraints interpretation problem

I generate Entity Data Model in Visual studio from the database.
However, I noticed that it does not generate neither relationships nor navigation properties from some foreign keys. It occurs when the foreign key contsraints are defined with the disabled option Enforce Foreign Key Constraint, like in the following exhibit (from SSMS).
Is there any way to deal with this? Unfortunately I cannot alter my database schema.
You can add them manually from the designer but it can have some consequences depending on the version of entity framework yo are using.
If you simply add association from the toolbox it by default creates independent association. Independent association must be mapped to the database counterpart. It means that you must manually open EDMX and cheat EF by modifying SSDL (you will add relation to SSDL part manually which can be quite hard task - follow SSDL reference: AssociationSet and Association elements). Now you can map the relation in the Mapping details window of the designer (you will also have to modify entities because FK property mustn't be mapped to the entity when independent association is used and in case of many-to-many association you will have to remove entity for junction table). EF will believe that this relation exists in the database. Once you modify SSDL manually you cannot use Update from the database any more. It will delete all your manual changes.
If you are using EFv4 you can use foreign key association (complete differences between those two types is described here). Foreign key association is not mapped but it cannot be used to define many-to-many relation.
The problem will occur if data in the database doesn't enforce the relation (which can happen because FKs are disabled). In such case your application will not work and there will be no way around this except repairing data integrity in the database or removing the association from the model.
The best solution for you is turning on FKs in the database!
Unfortunately You have to add those by hand in the model. That's the power of OR Mapping. Model can look different (better) than database.

Entity Framework - Cascade Delete not getting set in Entity Model

I am using EF 4.0 and am generating my Entity Model (.edmx) file from my database. I have several foreign key constraints for Cascade OnDelete, however, these are not getting set on my associations in my entity model. I click on the association and it shows End1 OnDelete: None.
When I check the Delete rules in my SQL Server 2008 database on my foreign key constraint, it says 'Cascade'.
Is there something I am missing to get the Cascade OnDelete flag to set in my entity model?
This answer
"I was having the same problem with SQL Server. When I tried to update mode from database, it didn't pick up the cascade rules. Note that the rules were added after the model was already created. I even tried deleting a table from the model and adding it back in. That had the same effect - no cascade rules.
However, when I created a brand new model with the same exact tables, it picked up the cascade rules. So my solution was just to delete the old model and create a new one with the same name, etc.
I guess is that there is something wrong with the update model from database process."
from this thread worked for me.

Configuring Entity Framework on a Database Undefined Foreign Key Relationships

For a variety of reasons the database that I'm working on (SQL Server 2005) doesn't have any relationships defined. Every table has a primary key. And most tables have at least one foreign key, however we've never configured the constraints.
Can anyone tell me the steps that I should take to inform Entity Framework of the underlying relationships between tables? Is there a particular document that describes this process?
You will need to manually create the associations between the tables in your EF model.
In the Entity Framework designer surface, you basically right-click on your table and from the context menu, you need to choose the "Add -> Association" option. In the dialog box that pops up, you can establish the association between your two tables - even without foreign key relationship in the underlying database.
Marc

Categories