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
Related
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.
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!
I have a table that links two other tables together. When I import these tables into the edmx file, EF automatically creates a navigation property between the two tables and does not create a entity table for the association. Which is great and useful; however, when doing some complex joins from other various tables it would be far more effective to be able to join off of the association table to limit the number of trips to the database.
I tired a solution where I would remove a table, add the middle table, and then re-add the other table. This worked; however, when building the project I get an error:
Error 3015: Problem in mapping fragments starting at lines 6123, 6490: Foreign key constraint 'fk_Um' from table UserModules (ModuleId) to table Modules (ModuleId):: Insufficient mapping: Foreign key must be mapped to some AssociationSet or EntitySets participating in a foreign key association on the conceptual side.
Is there a way to add in the association table, so I can directly join on it without going through the navigation property?
My team are using SqlMetal to generate database classes from a SqlServer database. It works perfectly for all of our existing classes and foreign key associations but it's refusing to generate the code for a particular new foreign key association that we want to add. This key is from an audit table to a global event table detailing the time the audit record was created and the user it was created by. Many similar foreign key associations between other audit tables and this global "event" table exist in the system and SqlMetal generates code for those associations.
I've tried resolving this problem by:
Dropping and recreating the table
Removing the primary key
Creating a new identical table with a different name
Removing all other fields from the table
Dumping the indexes
Performing a fresh database build
Renaming the foreign key
None of the above seem to resolve the problem. However, SqlMetal does correctly generate code for foreign key associations from this table to some (but not all) other tables in the system. The association between these two tables would only generate when I altered the original create table script to include the foreign key association rather than running it (or a new equivalent table) in later. Unfortunately, we need to be able to deploy this change as a script to our existing production database so this isn't an option. I've seen a couple of articles and forum posts mentioning similar problems but none seem to give any solution or even an explanation.
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.