How does the database represent One-to-One relationship? - c#

I am using a simple One-to-One relationship in entity framework core 2.0.
modelBuilder.Entity<Profile>()
.HasOne(p => p.Avatar)
.WithOne()
.HasForeignKey<Profile>(p => p.AvatarId);
Where every profile has only one avatar.
Looking in database managing apps does not show me (or at least I did not find) any differences between One-to-One and One-to-Many relationships. So what I mean I could not find any special constrains for One-to-One different that One-to-Many.
How does the database know which kind of relationships I defined? If it does not know, why would I then define the type of relationship I am using?

If you can't see any foreign keys or primary keys in your database then it doesn't know. Or more specifically: it you will be allowed to save data which violates the relationship.
Integrity of relationships are enforced in databases with Foreign Keys but this certainly does not stop you submitting SQL which joins tables incorrectly.
Here's a link to defining foreign keys that ensures that a one to one relationship is guaranteed based on the data in tables. http://www.tech-recipes.com/rx/56738/one-to-one-one-to-many-table-relationships-in-sql-server/ .

Related

Entity Framework: Is it possible to model an association without a corresponding foreign key

We have a database under complete control of dba's who refuse to add any foreign keys to the schema (don't ask).
I did not create the database schema, nor can I change it.
So far, we haven't found a way to model associations between entities, because EF refuses to do so without a foreign key in the schema.
Is there any way to bypass or replace Entity Framework's logic for verifying a foreign key exists? Does the EF architecture allow me to replace/modify this undesirable behavior? I feel like adding enough logic into repositories to "fake it" would be having to re-implement a significant fraction of EF functionality.

Entity Framework 6 - Navigation Property as Table

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?

Entity Framework Composite Key

I have a database with two tables, customer and account. Because multiple customers can exist on multiple accounts this is a many to many design.
This is how I designed it in SQL
This works quite nicely as Entity Framework picks up that its a mapping table and just maps Customer to Account as lists on each and hiding the mapping table. Brilliant!
I would like to extend this further to add preferences to a mapping between a customer and an account like such:
Am I right in assuming this is not possible? I have tried adding it to EF model but instead it brings back the mapping table.
Anyone else had any luck with this?
What you have in your first case is a simple many to many relation table, which in Entity Framework results in the collections of entities on one another.
If you want to have a relation to the Preference from your CustomerAccount relation table, the relation becomes complex and it cannot be depicted in the simple relation lists anymore. You need add an entity for your relation CustomerAccount which will have foreign keys on Customer, Account and Preference.

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.

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