I believe the following should work for you
public class Address { public int AddressId { get; set; } public string AddressString { get; set; } } public class User { public int UserId { get; set; } public virtual ICollection<Address> Addresses { get; set; } } public class House { public int HouseId { get; set; } public virtual Address Address { get; set; } } public class TestContext : DbContext { public DbSet<Address> Addresses { get; set; } public DbSet<User> Users { get; set; } public DbSet<House> Houses { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<User>().HasMany(u => u.Addresses).WithMany(); modelBuilder.Entity<House>().HasRequired(h => h.Address).WithOptional().Map(m => m.MapKey("AddressId")); } }
Please note that it is often better to specify foreign key fields yourself, which can make your life easier. If you do this, you can choose to rewrite the House as follows:
public class House { public int HouseId { get; set; } public int AddressId { get; set; } public virtual Address Address { get; set; } }
The convention will bind AddressId and Address. If you have a one-to-one mapping between Home and Address, you can also associate them with primary keys:
public class House { [ForeignKey("Address")] public int HouseId { get; set; } public virtual Address Address { get; set; } }
You mentioned that you would like to enforce at least one address β this is not possible with a one-to-many relationship. This can only be done if the user had exactly one address, after which you can add the required AddressId property to the User class.
One more comment - you made everything virtual in your code. You only need to make the navigation properties virtual.
source share