Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

One to zero-or-one with HasForeignKey

I have two models:

public class Person {     public virtual int Id { get; set; }     public virtual Employee Employee { get; set; } // optional }  public class Employee {     public virtual int Id { get; set; }     public virtual int PersonId { get; set; }      public virtual Person Person {get; set; } // required }  public class EmployeeConfiguration : EntityTypeConfiguration<Employee> {     public EmployeeConfiguration()     {         Property(e=>e.PersonId) // I need this property mapped             .HasColumnName("person_id")             .HasColumnType("int");     } } 

I want to map them using fluent mapping. Employee table has column 'person_id' which is non-nullable. I tried following:

HasRequired(e => e.Person)     .WithOptional(p => p.Employee)     .Map(m => m.MapKey("person_id")); 

But it fails with:

System.Data.Entity.ModelConfiguration.ModelValidationException : One or more validation errors were detected during model generation:

person_id: Name: Each property name in a type must be unique. Property name 'person_id' is already defined.

I need PersonId property on its own, so what I basically want is:

HasRequired(e => e.Person)     .WithOptional(p => p.Employee)     .HasForeignKey(e => e.PersonId); // there is no such method 

But there is no such method here as HasForeignKey

like image 453
joozek Avatar asked Sep 10 '13 13:09

joozek


People also ask

How to define foreign key in entity framework Core?

Foreign keyThe [ForeignKey] annotation can be placed on either navigation property in the relationship. It does not need to go on the navigation property in the dependent entity class. The property specified using [ForeignKey] on a navigation property doesn't need to exist on the dependent type.

Has foreign key fluent API?

The Entity Framework Core Fluent API HasForeignKey method is used to specify which property is the foreign key in a relationship. In the following example, the AuthorFK property in the Book entity does not follow Entity Framework Core's convention for foreign key names.

How do I add a foreign key in fluent API?

You can then configure foreign key properties by using the HasForeignKey method. This method takes a lambda expression that represents the property to be used as the foreign key.

What is fluent API .NET core?

Fluent API is an advanced way of specifying model configuration that covers everything that data annotations can do in addition to some more advanced configuration not possible with data annotations.


1 Answers

OK, I figured that out - you should use WithMany (yep, not obvious) in order to store foreign key in some property:

Property(e => e.PersonId).HasColumnName("person_id"); HasRequired(e => e.Person)     .WithMany()     .HasForeignKey(p => p.PersonId); 

See One-to-One Foreign Key Associations article for details. BTW this will create employee foreign key column for person's table, but there is no other way to have navigation property and foreign key separately.


If you need foreign key read-only, you can change PersonId property to:

public int PersonId { get { return Person.Id; } } 

And use your original mapping

HasRequired(e => e.Person)     .WithOptional(p => p.Employee)     .Map(m => m.MapKey("person_id")); 
like image 152
Sergey Berezovskiy Avatar answered Sep 20 '22 03:09

Sergey Berezovskiy