public void Can_add_weak_entity_types() { IMutableModel model = new Model(); var customerType = model.AddEntityType(typeof(Customer)); var idProperty = customerType.GetOrAddProperty(Customer.IdProperty); var customerKey = customerType.AddKey(idProperty); var dependentOrderType = model.AddEntityType(typeof(Order), nameof(Customer.Orders), customerType); var fkProperty = dependentOrderType.AddProperty("ShadowId", typeof(int)); var orderKey = dependentOrderType.AddKey(fkProperty); var fk = dependentOrderType.AddForeignKey(fkProperty, customerKey, customerType); var index = dependentOrderType.AddIndex(fkProperty); Assert.Same(fkProperty, dependentOrderType.GetProperties().Single()); Assert.Same(orderKey, dependentOrderType.GetKeys().Single()); Assert.Same(fk, dependentOrderType.GetForeignKeys().Single()); Assert.Same(index, dependentOrderType.GetIndexes().Single()); Assert.Equal(new[] { customerType, dependentOrderType }, model.GetEntityTypes()); Assert.True(model.HasEntityTypeWithDefiningNavigation(typeof(Order))); Assert.True(model.HasEntityTypeWithDefiningNavigation(typeof(Order).DisplayName())); Assert.Same( dependentOrderType, model.FindEntityType(typeof(Order).DisplayName(), nameof(Customer.Orders), customerType)); Assert.Same( dependentOrderType, model.FindEntityType(typeof(Order).DisplayName(), nameof(Customer.Orders), (IEntityType)customerType)); Assert.Equal( CoreStrings.ClashingWeakEntityType(typeof(Order).DisplayName(fullName: false)), Assert.Throws <InvalidOperationException>(() => model.AddEntityType(typeof(Order))).Message); Assert.Equal( CoreStrings.ClashingNonWeakEntityType( nameof(Customer) + "." + nameof(Customer.Orders) + "#" + nameof(Order) + "." + nameof(Order.Customer) + "#" + nameof(Customer)), Assert.Throws <InvalidOperationException>( () => model.AddEntityType(typeof(Customer), nameof(Order.Customer), dependentOrderType)).Message); Assert.Equal( CoreStrings.ForeignKeySelfReferencingDependentEntityType( nameof(Customer) + "." + nameof(Customer.Orders) + "#" + nameof(Order)), Assert.Throws <InvalidOperationException>( () => dependentOrderType.AddForeignKey(fkProperty, orderKey, dependentOrderType)).Message); Assert.Equal( CoreStrings.EntityTypeInUseByForeignKey( nameof(Customer) + "." + nameof(Customer.Orders) + "#" + nameof(Order), nameof(Customer), fk.Properties.Format()), Assert.Throws <InvalidOperationException>(() => model.RemoveEntityType(dependentOrderType)).Message); dependentOrderType.RemoveForeignKey(fk.Properties, fk.PrincipalKey, fk.PrincipalEntityType); Assert.Same( dependentOrderType, model.RemoveEntityType( typeof(Order), nameof(Customer.Orders), customerType)); Assert.Null(((EntityType)dependentOrderType).Builder); Assert.Null(model.RemoveEntityType(dependentOrderType)); }