Reputation: 17
I configure my One-to-Many relationships using this method:
private void ConfigureRelationshipOneToMany<E, T>(ModelBuilder builder, string key, Expression<Func<E, T>> propertyMapping) where E : class where T : class {
builder.Entity<E>()
.Property<string>(key);
builder.Entity<E>()
.HasOne(propertyMapping)
.WithMany()
.HasForeignKey(key);
}
ConfigureRelationshipOneToMany<ProductStyle, ProductGroup>(builder, "ProductGroupCode", s => s.ProductGroup);
public class ProductStyle {
[Key]
public string Code { get; set; }
public string Name { get; set; }
public ProductGroup ProductGroup { get; set; }
}
public class ProductGroup {
[Key]
public string Code { get; set; }
public string Name { get; set; }
}
This works fine and all of my relationships are correctly configured with Shadow Properties for the foreign keys. I'm trying to implement the equivalent for One-to-Many relationships like this:
private void ConfigureRelationshipOneToOne<E, T>(ModelBuilder builder, string key, Expression<Func<E, T>> propertyMapping, Expression<Func<T, E>> returnMapping) where E : class where T : class {
builder.Entity<T>()
.Property<string>(key);
builder.Entity<E>()
.HasOne(propertyMapping)
.WithOne(returnMapping)
.HasForeignKey(key);
}
ConfigureRelationshipOneToOne<Product, ProductDimensions>(builder, "SKU", p => p.Dimensions, d => d.Product);
The product class already has a property "SKU" which is the primary key. When I try to add a migration I get this error:
System.InvalidOperationException: You are configuring a relationship between 'ProductDimensions' and 'Product' but have specified a foreign key on 'SKU'. The foreign key must be defined on a type that is part of the relationship.
My goal is to have a bi-directional mapping between Product and ProductDimensions on the SKU field without having to have a SKU property on the ProductDimensions class. How can I achieve this?
Upvotes: 0
Views: 228
Reputation: 17
private void ConfigureRelationshipOneToOne<E, T>(ModelBuilder builder, string key, Expression<Func<E, T>> propertyMapping, Expression<Func<T, E>> returnMapping) where E : class where T : class {
builder.Entity<T>()
.Property<string>(key);
builder.Entity<T>()
.HasKey(key);
builder.Entity<E>()
.HasOne(propertyMapping)
.WithOne(returnMapping)
.HasForeignKey<T>(key);
}
Upvotes: 0