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?
Related
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 created a table in SQL that just contained 2 foreign keys, Which Linked a single Bulk upload entry to many titles. After updating my edmx model.
I noticed there is no table in the diagram.
Just an Association mapped between my title table and my bulkupload table.
There is no table in the diagram so I cannot delete the table.
I cannot add things to the table because there is no connection in the C# Code. '
Does anybody have information on why this is happening and how I can fix and add this table so its able to add entries to it?
You can leave it as an association if you'd like. To add things to you junction table you add things to your Icollection so in pseducode:
BulkEntry.Titles.add(TitleToAdd)
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.
By default EF hides a many to many join table that does not contain additional data than the foreign keys to the joined tables.
Is it possible to tell EF (and the designer) to explicitly create the join table and make it usable in code?
Thanks
No EF designer will not add this entity for you. If you want junction table exposed you must manually delete created relation and add junction table's entity and two one-to-many FK relations. Here are related questions with step by step guide:
How to expose the join table in many to many relation
How to get Entity to Table mapping for many to many relations
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