EF Code First 5 - How to define nullable foreign key using Fluent API?

c#, entity-framework-5, fluent

Solution

You do not have to specify the key-property unless you really want to, which is kinda the idea of code first :)

According to this article by Microsoft it should be enough to remove the foreign key properties. Have a look at the differences between figure 1 and figure 2 in the article. (The keys will of course be generated at the database level, but do you really need them in the model?)

Problem

I have two table - ``` 1. Account 2. Users ``` In `Account` table, `DefaultExpensePartner` and `AccountOwner` are foreign key of `UserId` field of `Users` table. I have defined classes as below. ``` public class Account { public int AccountId { get; set; } public string AccountName { get; set; } public int? AccountOwnerId { get; set; } public int? DefaultExpensePartnerId { get; set; } public virtual Users AccountOwner { get; set; } public virtual Users DefaultExpensePartner { get; set; } } public class AccountConfiguration : EntityTypeConfiguration<Account> { public AccountConfiguration() { this.ToTable("Account"); this.HasKey(c => c.AccountId); this.Property(c => c.AccountId) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) .IsRequired(); this.Property(c => c.AccountName) .HasMaxLength(50) .IsRequired(); this.Property(c => c.AccountOwnerId) .HasColumnName("AccountOwner") .IsOptional(); this.Property(c => c.DefaultExpensePartnerId) .HasColumnName("DefaultExpensePartner") .IsOptional(); this.HasRequired(c => c.DefaultExpensePartner) .WithMany() .HasForeignKey(c => c.DefaultExpensePartnerId) .WillCascadeOnDelete(false); this.HasRequired(c => c.AccountOwner) .WithMany() .HasForeignKey(c => c.AccountOwnerId) .WillCascadeOnDelete(false); } } public class Users { public int UserId { get; set; } public string Email { get; set; } public string DisplayName { get; set; } public string PasswordSalt1 { get; set; } public string PasswordSalt2 { get; set; } public string PasswordHash { get; set; } } public class UsersConfiguration : EntityTypeConfiguration<Users> { public UsersConfiguration() { this.ToTable("Users"); this.HasKey(c => c.UserId); this.Property(c => c.UserId) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) .IsRequired(); this.Property(c => c.Email) .HasMaxLength(80) .IsRequired(); this.Property(c => c.DisplayName) .HasMaxLength(50) .IsRequired(); this.Property(c => c.PasswordSalt1) .HasMaxLength(172) .IsRequired(); this.Property(c => c.PasswordSalt2) .HasMaxLength(172) .IsRequired(); this.Property(c => c.PasswordHash) .HasMaxLength(40) .IsRequired(); } } ``` Though I am able to establish foreign key relationship for `AccountOwner` and `DefaultExpensePartner` fields, they are defined as non-null in database which is incorrect according to my original plan. Can anyone know how to define foreign key as nullable?

Original source