public void Property_DeclaringEntityType_Returns_DeclaredType() { Mock<EntityTypeConfiguration> mockDeclaringType = new Mock<EntityTypeConfiguration>(); NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(new MockPropertyInfo(), EdmMultiplicity.One, mockDeclaringType.Object); Assert.Equal(mockDeclaringType.Object, navigationProperty.DeclaringEntityType); }
public void Required_ModifiesMultiplicityToOne() { NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(new MockPropertyInfo(), EdmMultiplicity.ZeroOrOne, new EntityTypeConfiguration()); navigationProperty.Required(); Assert.Equal(EdmMultiplicity.One, navigationProperty.Multiplicity); }
public void Optional_Throws_IfMultiplicityIsMany() { NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(new MockPropertyInfo(typeof(int[]), "P"), EdmMultiplicity.Many, new EntityTypeConfiguration()); Assert.Throws<InvalidOperationException>( () => navigationProperty.Optional(), "Cannot change multiplicity of the collection navigation property 'P'."); }
public void CascadeOnDelete_ModifiesOnDelete() { // Arrange NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(new MockPropertyInfo(), EdmMultiplicity.ZeroOrOne, new EntityTypeConfiguration()); // Act navigationProperty.CascadeOnDelete(); // Assert Assert.Equal(EdmOnDeleteAction.Cascade, navigationProperty.OnDeleteAction); }
/// <summary> /// Finds the binding for the given navigation property. /// </summary> /// <param name="autoCreate">Tells whether the binding should be auto created if it does not exist.</param> /// <param name="navigationConfiguration">The navigation property.</param> /// <returns>The <see cref="NavigationPropertyBindingConfiguration"/> so that it can be further configured.</returns> public virtual NavigationPropertyBindingConfiguration FindBinding(NavigationPropertyConfiguration navigationConfiguration, bool autoCreate) { if (navigationConfiguration == null) { throw Error.ArgumentNull("navigationConfiguration"); } NavigationPropertyBindingConfiguration bindingConfiguration; if (_navigationPropertyBindings.TryGetValue(navigationConfiguration, out bindingConfiguration)) { return(bindingConfiguration); } if (!autoCreate) { return(null); } bool hasSingletonAttribute = navigationConfiguration.PropertyInfo.GetCustomAttributes <SingletonAttribute>().Any(); Type entityType = navigationConfiguration.RelatedClrType; INavigationSourceConfiguration[] matchedNavigationSources; if (hasSingletonAttribute) { matchedNavigationSources = _modelBuilder.Singletons.Where(es => es.EntityType.ClrType == entityType).ToArray(); } else { matchedNavigationSources = _modelBuilder.EntitySets.Where(es => es.EntityType.ClrType == entityType).ToArray(); } if (matchedNavigationSources.Length == 1) { return(AddBinding(navigationConfiguration, matchedNavigationSources[0])); } else if (matchedNavigationSources.Length == 0) { return(null); } else { throw Error.NotSupported( SRResources.CannotAutoCreateMultipleCandidates, navigationConfiguration.Name, navigationConfiguration.DeclaringEntityType.FullName, Name, String.Join(", ", matchedNavigationSources.Select(s => s.Name))); } }
public void HasManyPath_AddBindindPath_Derived(bool contained) { // Assert ODataModelBuilder builder = new ODataModelBuilder(); var customerType = builder.EntityType <BindingCustomer>(); var navigationSource = builder.EntitySet <BindingCustomer>("Customers"); StructuralTypeConfiguration addressType = builder.StructuralTypes.FirstOrDefault(c => c.Name == "BindingAddress"); Assert.Null(addressType); // Guard Assert.Empty(customerType.Properties); // Guard // Act var binding = new BindingPathConfiguration <BindingCustomer>(builder, customerType, navigationSource.Configuration); var newBinding = binding.HasManyPath((BindingVipCustomer v) => v.VipAddresses, contained); // Assert addressType = builder.StructuralTypes.FirstOrDefault(c => c.Name == "BindingAddress"); Assert.NotNull(addressType); Assert.Empty(customerType.Properties); StructuralTypeConfiguration vipCustomerType = builder.StructuralTypes.FirstOrDefault(c => c.Name == "BindingVipCustomer"); Assert.NotNull(vipCustomerType); var vipAddressesProperty = Assert.Single(vipCustomerType.Properties); Assert.Equal("VipAddresses", vipAddressesProperty.Name); if (contained) { Assert.Equal(EdmTypeKind.Entity, addressType.Kind); Assert.Equal(PropertyKind.Navigation, vipAddressesProperty.Kind); NavigationPropertyConfiguration navigationProperty = Assert.IsType <NavigationPropertyConfiguration>(vipAddressesProperty); Assert.Equal(EdmMultiplicity.Many, navigationProperty.Multiplicity); Assert.True(navigationProperty.ContainsTarget); } else { Assert.Equal(EdmTypeKind.Complex, addressType.Kind); Assert.Equal(PropertyKind.Collection, vipAddressesProperty.Kind); CollectionPropertyConfiguration collection = Assert.IsType <CollectionPropertyConfiguration>(vipAddressesProperty); Assert.Equal(typeof(BindingAddress), collection.ElementType); } // different bindings Assert.NotSame(binding, newBinding); Assert.Equal("", binding.BindingPath); Assert.IsType <BindingPathConfiguration <BindingAddress> >(newBinding); Assert.Equal("System.Web.OData.Formatter.BindingVipCustomer/VipAddresses", newBinding.BindingPath); }
public void HasNavigationPropertyLink(NavigationPropertyConfiguration navigationProperty, Func <EntityInstanceContext <TEntityType>, IEdmNavigationProperty, Uri> navigationLinkFactory, bool followsConventions) { if (navigationProperty == null) { throw Error.ArgumentNull("navigationProperty"); } if (navigationLinkFactory == null) { throw Error.ArgumentNull("navigationLinkFactory"); } _configuration.HasNavigationPropertyLink(navigationProperty, new NavigationLinkBuilder((entity, property) => navigationLinkFactory(UpCastEntityInstanceContext(entity), property), followsConventions)); }
private NavigationPropertyConfiguration AddNavigationProperty(PropertyInfo navigationProperty, EdmMultiplicity multiplicity, bool containsTarget) { if (navigationProperty == null) { throw Error.ArgumentNull("navigationProperty"); } if (!navigationProperty.ReflectedType.IsAssignableFrom(ClrType)) { throw Error.Argument("navigationProperty", SRResources.PropertyDoesNotBelongToType, navigationProperty.Name, ClrType.FullName); } ValidatePropertyNotAlreadyDefinedInBaseTypes(navigationProperty); ValidatePropertyNotAlreadyDefinedInDerivedTypes(navigationProperty); PropertyConfiguration propertyConfig; NavigationPropertyConfiguration navigationPropertyConfig; if (ExplicitProperties.ContainsKey(navigationProperty)) { propertyConfig = ExplicitProperties[navigationProperty]; if (propertyConfig.Kind != PropertyKind.Navigation) { throw Error.Argument("navigationProperty", SRResources.MustBeNavigationProperty, navigationProperty.Name, ClrType.FullName); } navigationPropertyConfig = propertyConfig as NavigationPropertyConfiguration; if (navigationPropertyConfig.Multiplicity != multiplicity) { throw Error.Argument("navigationProperty", SRResources.MustHaveMatchingMultiplicity, navigationProperty.Name, multiplicity); } } else { navigationPropertyConfig = new NavigationPropertyConfiguration( navigationProperty, multiplicity, this); if (containsTarget) { navigationPropertyConfig = navigationPropertyConfig.Contained(); } ExplicitProperties[navigationProperty] = navigationPropertyConfig; // make sure the related type is configured ModelBuilder.AddEntityType(navigationPropertyConfig.RelatedClrType); } return(navigationPropertyConfig); }
private void VerifyBindingPath(NavigationPropertyConfiguration navigationConfiguration, IList <MemberInfo> bindingPath) { Contract.Assert(navigationConfiguration != null); Contract.Assert(bindingPath != null); PropertyInfo navigation = bindingPath.Last() as PropertyInfo; if (navigation == null || navigation != navigationConfiguration.PropertyInfo) { throw Error.Argument("navigationConfiguration", SRResources.NavigationPropertyBindingPathIsNotValid, bindingPath.ConvertBindingPath(), navigationConfiguration.Name); } bindingPath.Aggregate(EntityType.ClrType, VerifyBindingSegment); }
public void NonContained_ModifiesContainsTargetToFalse() { // Arrange NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration( new MockPropertyInfo(), EdmMultiplicity.ZeroOrOne, new EntityTypeConfiguration()); // Act navigationProperty.Contained().NonContained(); // Assert Assert.False(navigationProperty.ContainsTarget); }
public void HasConstraint_Throws_MultiplicityMany() { // Arrange Mock <EntityTypeConfiguration> entityType = new Mock <EntityTypeConfiguration>(); entityType.Setup(c => c.ClrType).Returns(typeof(NavigationPropertyConfigurationTest)); NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration( new MockPropertyInfo(typeof(List <NavigationPropertyConfigurationTest>), "Navigation"), EdmMultiplicity.Many, entityType.Object); // Act & Assert Assert.Throws <NotSupportedException>( () => navigationProperty.HasConstraint(new MockPropertyInfo(), new MockPropertyInfo()), String.Format(SRResources.ReferentialConstraintOnManyNavigationPropertyNotSupported, "Navigation", typeof(NavigationPropertyConfigurationTest).FullName)); }
public NavigationPropertyConfiguration HasRequired <TTargetEntity>( Expression <Func <TEntityType, TTargetEntity> > navigationPropertyExpression, Expression <Func <TEntityType, TTargetEntity, bool> > referentialConstraintExpression) where TTargetEntity : class { NavigationPropertyConfiguration navigation = GetOrCreateNavigationProperty(navigationPropertyExpression, EdmMultiplicity.One); IDictionary <PropertyInfo, PropertyInfo> referentialConstraints = PropertyPairSelectorVisitor.GetSelectedProperty(referentialConstraintExpression); foreach (KeyValuePair <PropertyInfo, PropertyInfo> constraint in referentialConstraints) { navigation.HasConstraint(constraint); } return(navigation); }
private static void FindNavigationProperties(this ODataModelBuilder builder, StructuralTypeConfiguration configuration, IList <Tuple <StructuralTypeConfiguration, IList <MemberInfo>, NavigationPropertyConfiguration> > navs, Stack <MemberInfo> path) { Contract.Assert(builder != null); Contract.Assert(configuration != null); Contract.Assert(navs != null); Contract.Assert(path != null); foreach (var property in configuration.Properties) { path.Push(property.PropertyInfo); NavigationPropertyConfiguration nav = property as NavigationPropertyConfiguration; ComplexPropertyConfiguration complex = property as ComplexPropertyConfiguration; CollectionPropertyConfiguration collection = property as CollectionPropertyConfiguration; if (nav != null) { // how about the containment? IList <MemberInfo> bindingPath = path.Reverse().ToList(); navs.Add( new Tuple <StructuralTypeConfiguration, IList <MemberInfo>, NavigationPropertyConfiguration>(configuration, bindingPath, nav)); } else if (complex != null) { StructuralTypeConfiguration complexType = builder.GetTypeConfigurationOrNull(complex.RelatedClrType) as StructuralTypeConfiguration; builder.FindAllNavigationProperties(complexType, navs, path); } else if (collection != null) { IEdmTypeConfiguration edmType = builder.GetTypeConfigurationOrNull(collection.ElementType); if (edmType != null && edmType.Kind == EdmTypeKind.Complex) { StructuralTypeConfiguration complexType = (StructuralTypeConfiguration)edmType; builder.FindAllNavigationProperties(complexType, navs, path); } } path.Pop(); } }
/// <summary> /// Removes the binding for the given navigation property and the given binding path. /// </summary> /// <param name="navigationConfiguration">The navigation property.</param> /// <param name="bindingPath">The binding path.</param> public virtual void RemoveBinding(NavigationPropertyConfiguration navigationConfiguration, string bindingPath) { if (navigationConfiguration == null) { throw Error.ArgumentNull("navigationConfiguration"); } Dictionary <string, NavigationPropertyBindingConfiguration> navigationPropertyBindingMap; if (_navigationPropertyBindings.TryGetValue(navigationConfiguration, out navigationPropertyBindingMap)) { navigationPropertyBindingMap.Remove(bindingPath); if (!navigationPropertyBindingMap.Any()) { _navigationPropertyBindings.Remove(navigationConfiguration); } } }
public void HasConstraint_Throws_DependentAndPrincipalTypeNotMatch() { // Arrange PropertyInfo principalPropertyInfo = typeof(Principal).GetProperty("PrincipalKey2"); PropertyInfo dependentPropertyInfo = typeof(Dependent).GetProperty("DependentKey1"); ODataModelBuilder builder = new ODataModelBuilder(); builder.AddEntityType(typeof(Principal)); EntityTypeConfiguration dependentEntity = builder.AddEntityType(typeof(Dependent)); NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One, dependentEntity); // Act & Assert Assert.Throws <InvalidOperationException>( () => navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo), String.Format(SRResources.DependentAndPrincipalTypeNotMatch, "System.Int32", "System.String")); }
public void HasConstraint_Throws_ReferentialConstraintPropertyTypeNotValid() { // Arrange PropertyInfo principalPropertyInfo = typeof(Principal).GetProperty("MockPrincipal"); PropertyInfo dependentPropertyInfo = typeof(Dependent).GetProperty("MockDependent"); ODataModelBuilder builder = new ODataModelBuilder(); builder.AddEntityType(typeof(Principal)); EntityTypeConfiguration dependentEntity = builder.AddEntityType(typeof(Dependent)); NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One, dependentEntity); // Act & Assert Assert.Throws <InvalidOperationException>( () => navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo), String.Format(SRResources.ReferentialConstraintPropertyTypeNotValid, "System.Web.OData.MockType")); }
public void CanSetSinglePrincipalProperty_ForReferencialConstraint() { // Arrange PropertyInfo expectDependentPropertyInfo = typeof(ForeignEntity).GetProperty("ForeignKey1"); PropertyInfo expectPrincipalPropertyInfo = typeof(ForeignPrincipal).GetProperty("PrincipalKey1"); ODataModelBuilder builder = new ODataModelBuilder(); // Act NavigationPropertyConfiguration navigationProperty = builder.EntityType <ForeignEntity>().HasRequired(c => c.Principal, (c, r) => c.ForeignKey1 == r.PrincipalKey1); // Assert PropertyInfo actualPropertyInfo = Assert.Single(navigationProperty.DependentProperties); Assert.Same(expectDependentPropertyInfo, actualPropertyInfo); actualPropertyInfo = Assert.Single(navigationProperty.PrincipalProperties); Assert.Same(expectPrincipalPropertyInfo, actualPropertyInfo); }
public void HasConstraint_CanSetDependentAndPrincipalProperty() { // Arrange PropertyInfo principalPropertyInfo = typeof(Principal).GetProperty("PrincipalKey1"); PropertyInfo dependentPropertyInfo = typeof(Dependent).GetProperty("DependentKey1"); ODataModelBuilder builder = new ODataModelBuilder(); builder.AddEntityType(typeof(Principal)); EntityTypeConfiguration dependentEntity = builder.AddEntityType(typeof(Dependent)); NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One, dependentEntity); // Act navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo); // Assert Assert.Same(principalPropertyInfo, Assert.Single(navigationProperty.PrincipalProperties)); Assert.Same(dependentPropertyInfo, Assert.Single(navigationProperty.DependentProperties)); }
public void CanSetBasePrincipalProperty_ForReferencialConstraint() { // Arrange PropertyInfo expectPrincipalPropertyInfo = typeof(DerivedPrincipal).GetProperty("PrincipalId"); PropertyInfo expectDependentPropertyInfo = typeof(DependentEntity).GetProperty("PrincipalKey"); ODataModelBuilder builder = new ODataModelBuilder(); // Act NavigationPropertyConfiguration navigationProperty = builder.EntityType <DependentEntity>().HasRequired(d => d.Principal, (d, p) => d.PrincipalKey == p.PrincipalId); // Assert PropertyInfo actualPropertyInfo = Assert.Single(navigationProperty.DependentProperties); Assert.Same(expectDependentPropertyInfo, actualPropertyInfo); actualPropertyInfo = Assert.Single(navigationProperty.PrincipalProperties); Assert.NotSame(expectPrincipalPropertyInfo, actualPropertyInfo); Assert.Same(typeof(BasePrincipal).GetProperty("PrincipalId"), actualPropertyInfo); }
/// <summary> /// Configures the navigation link for the given navigation property for entities from this entity set. /// </summary> /// <param name="navigationProperty">The navigation property for which the navigation link is being generated.</param> /// <param name="navigationLinkBuilder">The builder used to generate the navigation link.</param> /// <returns>Returns itself so that multiple calls can be chained.</returns> public virtual EntitySetConfiguration HasNavigationPropertyLink(NavigationPropertyConfiguration navigationProperty, NavigationLinkBuilder navigationLinkBuilder) { if (navigationProperty == null) { throw Error.ArgumentNull("navigationProperty"); } if (navigationLinkBuilder == null) { throw Error.ArgumentNull("navigationLinkBuilder"); } EntityTypeConfiguration declaringEntityType = navigationProperty.DeclaringEntityType; if (!(declaringEntityType.IsAssignableFrom(EntityType) || EntityType.IsAssignableFrom(declaringEntityType))) { throw Error.Argument("navigationProperty", SRResources.NavigationPropertyNotInHierarchy, declaringEntityType.FullName, EntityType.FullName, Name); } _navigationPropertyLinkBuilders[navigationProperty] = navigationLinkBuilder; return(this); }
/// <summary> /// Initializes a new instance of the <see cref="NavigationPropertyBindingConfiguration"/> class. /// </summary> /// <param name="navigationProperty">The navigation property for the binding.</param> /// <param name="navigationSource">The target navigation source of the binding.</param> /// <param name="path">The path of current binding.</param> public NavigationPropertyBindingConfiguration(NavigationPropertyConfiguration navigationProperty, NavigationSourceConfiguration navigationSource, IList <MemberInfo> path) { if (navigationProperty == null) { throw new ArgumentNullException("navigationProperty"); } if (navigationSource == null) { throw new ArgumentNullException("navigationSource"); } if (path == null) { throw new ArgumentNullException("path"); } NavigationProperty = navigationProperty; TargetNavigationSource = navigationSource; Path = path; }
public NavigationPropertyBindingConfiguration HasOptionalBinding <TTargetType, TDerivedType>( Expression <Func <TDerivedType, TTargetType> > navigationExpression, string targetEntitySet) where TTargetType : class where TDerivedType : class, TStructuralType { if (navigationExpression == null) { throw Error.ArgumentNull("navigationExpression"); } if (String.IsNullOrEmpty(targetEntitySet)) { throw Error.ArgumentNullOrEmpty("targetEntitySet"); } StructuralTypeConfiguration <TDerivedType> derivedConfiguration; if (this._structuralType.Configuration.Kind == EdmTypeKind.Entity) { derivedConfiguration = _modelBuilder.EntityType <TDerivedType>().DerivesFrom <TStructuralType>(); } else { derivedConfiguration = _modelBuilder.ComplexType <TDerivedType>().DerivesFrom <TStructuralType>(); } NavigationPropertyConfiguration navigation = derivedConfiguration.HasOptional(navigationExpression); IList <MemberInfo> bindingPath = new List <MemberInfo>(_bindingPath); bindingPath.Add(typeof(TDerivedType)); bindingPath.Add(navigation.PropertyInfo); NavigationSourceConfiguration entitySet = _modelBuilder.EntitySet <TTargetType>(targetEntitySet).Configuration; return(this._navigationSource.AddBinding(navigation, entitySet, bindingPath)); }
/// <summary> /// Finds the binding for the given navigation property. /// </summary> /// <param name="autoCreate">Tells whether the binding should be auto created if it does not exist.</param> /// <param name="navigationConfiguration">The navigation property.</param> /// <returns>The <see cref="NavigationPropertyBindingConfiguration"/> so that it can be further configured.</returns> public virtual NavigationPropertyBindingConfiguration FindBinding(NavigationPropertyConfiguration navigationConfiguration, bool autoCreate) { if (navigationConfiguration == null) { throw Error.ArgumentNull("navigationConfiguration"); } if (_entitySetBindings.ContainsKey(navigationConfiguration)) { return(_entitySetBindings[navigationConfiguration]); } if (!autoCreate) { return(null); } Type entityType = navigationConfiguration.RelatedClrType; EntitySetConfiguration[] matchingSets = _modelBuilder.EntitySets.Where(es => es.EntityType.ClrType == entityType).ToArray(); if (matchingSets.Count() == 1) { return(AddBinding(navigationConfiguration, matchingSets[0])); } else if (!matchingSets.Any()) { return(null); } else { throw Error.NotSupported( SRResources.CannotAutoCreateMultipleCandidates, navigationConfiguration.Name, navigationConfiguration.DeclaringEntityType.FullName, Name, String.Join(", ", matchingSets.Select(entitySet => entitySet.Name))); } }
public static void HasNavigationPropertyLink <TEntity, TValue>( this EntitySetConfiguration <TEntity> entitySet, NavigationPropertyConfiguration navigationProperty, Expression <Func <TEntity, TValue> > foreignKeyProperty, string targetEntitySetName) where TEntity : class { Arg.NotNull(entitySet, nameof(entitySet)); Arg.NotNull(navigationProperty, nameof(navigationProperty)); Arg.NotNull(foreignKeyProperty, nameof(foreignKeyProperty)); Arg.NotNullOrEmpty(targetEntitySetName, nameof(targetEntitySetName)); var foreignKeyPropertyName = foreignKeyProperty.GetPropertyName(); entitySet.HasNavigationPropertyLink( navigationProperty, (context, property) => { var entity = context.EdmObject; object value; if (!entity.TryGetPropertyValue(foreignKeyPropertyName, out value)) { return(null); } if (value == null) { return(null); } var entitySetPath = new EntitySetPathSegment(targetEntitySetName); var keyValuePath = new KeyValuePathSegment(ODataUriUtils.ConvertToUriLiteral(value, ODataVersion.V4)); var url = new Uri(context.Url.CreateODataLink(entitySetPath, keyValuePath)); return(url); }, false); }
/// <summary> /// Binds the given navigation property to the target navigation source. /// </summary> /// <param name="navigationConfiguration">The navigation property.</param> /// <param name="targetNavigationSource">The target navigation source.</param> /// <returns>The <see cref="NavigationPropertyBindingConfiguration"/> so that it can be further configured.</returns> public virtual NavigationPropertyBindingConfiguration AddBinding(NavigationPropertyConfiguration navigationConfiguration, INavigationSourceConfiguration targetNavigationSource) { if (navigationConfiguration == null) { throw Error.ArgumentNull("navigationConfiguration"); } if (targetNavigationSource == null) { throw Error.ArgumentNull("targetNavigationSource"); } EntityTypeConfiguration declaringEntityType = navigationConfiguration.DeclaringEntityType; if (!(declaringEntityType.IsAssignableFrom(EntityType) || EntityType.IsAssignableFrom(declaringEntityType))) { throw Error.Argument("navigationConfiguration", SRResources.NavigationPropertyNotInHierarchy, declaringEntityType.FullName, EntityType.FullName, Name); } NavigationPropertyBindingConfiguration navigationPropertyBinding; if (_navigationPropertyBindings.TryGetValue(navigationConfiguration, out navigationPropertyBinding)) { if (navigationPropertyBinding.TargetNavigationSource != targetNavigationSource) { throw Error.NotSupported(SRResources.RebindingNotSupported); } } else { navigationPropertyBinding = new NavigationPropertyBindingConfiguration(navigationConfiguration, targetNavigationSource); _navigationPropertyBindings[navigationConfiguration] = navigationPropertyBinding; } return(navigationPropertyBinding); }
public void HasConstraint_Throws_ReferentialConstraintAlreadyConfigured_Principal() { // Arrange PropertyInfo principalPropertyInfo = typeof(Principal).GetProperty("PrincipalKey1"); PropertyInfo dependentPropertyInfo = typeof(Dependent).GetProperty("DependentKey1"); PropertyInfo otherPrincipalPropertyInfo = typeof(Dependent).GetProperty("DependentKey2"); ODataModelBuilder builder = new ODataModelBuilder(); builder.AddEntityType(typeof(Principal)); EntityTypeConfiguration dependentEntity = builder.AddEntityType(typeof(Dependent)); NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One, dependentEntity); navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo); // Act & Assert Assert.Throws <InvalidOperationException>( () => navigationProperty.HasConstraint(otherPrincipalPropertyInfo, principalPropertyInfo), String.Format(SRResources.ReferentialConstraintAlreadyConfigured, "principal", "PrincipalKey1", "dependent", "DependentKey1")); }
/// <summary> /// Binds the given navigation property to the target entity set. /// </summary> /// <param name="navigationConfiguration">The navigation property.</param> /// <param name="targetEntitySet">The target entity set.</param> /// <returns>The <see cref="NavigationPropertyBindingConfiguration"/> so that it can be further configured.</returns> public virtual NavigationPropertyBindingConfiguration AddBinding(NavigationPropertyConfiguration navigationConfiguration, EntitySetConfiguration targetEntitySet) { if (navigationConfiguration == null) { throw Error.ArgumentNull("navigationConfiguration"); } if (targetEntitySet == null) { throw Error.ArgumentNull("targetEntitySet"); } EntityTypeConfiguration declaringEntityType = navigationConfiguration.DeclaringEntityType; if (!(declaringEntityType.IsAssignableFrom(EntityType) || EntityType.IsAssignableFrom(declaringEntityType))) { throw Error.Argument("navigationConfiguration", SRResources.NavigationPropertyNotInHierarchy, declaringEntityType.FullName, EntityType.FullName, Name); } NavigationPropertyBindingConfiguration navigationPropertyBinding = null; if (_entitySetBindings.ContainsKey(navigationConfiguration)) { navigationPropertyBinding = _entitySetBindings[navigationConfiguration]; if (navigationPropertyBinding.EntitySet != targetEntitySet) { throw Error.NotSupported(SRResources.RebindingNotSupported); } } else { navigationPropertyBinding = new NavigationPropertyBindingConfiguration(navigationConfiguration, targetEntitySet); _entitySetBindings[navigationConfiguration] = navigationPropertyBinding; } return(navigationPropertyBinding); }
public void HasOptionalBinding_AddBindindToNavigationSource_Derived() { // Assert ODataModelBuilder builder = new ODataModelBuilder(); var customerType = builder.EntityType <BindingCustomer>(); var navigationSource = builder.EntitySet <BindingCustomer>("Customers"); StructuralTypeConfiguration addressType = builder.StructuralTypes.FirstOrDefault(c => c.Name == "BindingAddress"); Assert.Null(addressType); // Guard Assert.Empty(customerType.Properties); // Guard Assert.Null(builder.EntitySets.FirstOrDefault(e => e.Name == "Cities_D")); // Guard // Act new BindingPathConfiguration <BindingCustomer>(builder, customerType, navigationSource.Configuration) .HasSinglePath((BindingVipCustomer v) => v.VipLocation) .HasOptionalBinding((BindingUsAddress u) => u.UsCity, "Cities_D"); // Assert var usAddressType = builder.StructuralTypes.FirstOrDefault(c => c.Name == "BindingUsAddress"); Assert.NotNull(usAddressType); PropertyConfiguration citiesProperty = Assert.Single(usAddressType.Properties); Assert.Equal("UsCity", citiesProperty.Name); NavigationPropertyConfiguration navigationProperty = Assert.IsType <NavigationPropertyConfiguration>(citiesProperty); Assert.Equal(EdmMultiplicity.ZeroOrOne, navigationProperty.Multiplicity); var bindings = navigationSource.FindBinding(navigationProperty); var binding = Assert.Single(bindings); Assert.Equal("Cities_D", binding.TargetNavigationSource.Name); Assert.Equal("System.Web.OData.Formatter.BindingVipCustomer/VipLocation/System.Web.OData.Formatter.BindingUsAddress/UsCity", binding.BindingPath); }
/// <summary> /// Binds the given navigation property to the target navigation source. /// </summary> /// <param name="navigationConfiguration">The navigation property.</param> /// <param name="targetNavigationSource">The target navigation source.</param> /// <returns>The <see cref="NavigationPropertyBindingConfiguration"/> so that it can be further configured.</returns> public virtual NavigationPropertyBindingConfiguration AddBinding(NavigationPropertyConfiguration navigationConfiguration, NavigationSourceConfiguration targetNavigationSource) { if (navigationConfiguration == null) { throw Error.ArgumentNull("navigationConfiguration"); } if (targetNavigationSource == null) { throw Error.ArgumentNull("targetNavigationSource"); } IList <MemberInfo> bindingPath = new List <MemberInfo> { navigationConfiguration.PropertyInfo }; if (navigationConfiguration.DeclaringType != EntityType) { bindingPath.Insert(0, navigationConfiguration.DeclaringType.ClrType); } return(AddBinding(navigationConfiguration, targetNavigationSource, bindingPath)); }
/// <summary> /// Finds the binding for the given navigation property. /// </summary> /// <param name="autoCreate">Tells whether the binding should be auto created if it does not exist.</param> /// <param name="navigationConfiguration">The navigation property.</param> /// <returns>The <see cref="NavigationPropertyBindingConfiguration"/> so that it can be further configured.</returns> public virtual NavigationPropertyBindingConfiguration FindBinding(NavigationPropertyConfiguration navigationConfiguration, bool autoCreate) { if (navigationConfiguration == null) { throw Error.ArgumentNull("navigationConfiguration"); } if (_entitySetBindings.ContainsKey(navigationConfiguration)) { return _entitySetBindings[navigationConfiguration]; } if (!autoCreate) { return null; } Type entityType = navigationConfiguration.RelatedClrType; EntitySetConfiguration[] matchingSets = _modelBuilder.EntitySets.Where(es => es.EntityType.ClrType == entityType).ToArray(); if (matchingSets.Count() == 1) { return AddBinding(navigationConfiguration, matchingSets[0]); } else if (!matchingSets.Any()) { return null; } else { throw Error.NotSupported( SRResources.CannotAutoCreateMultipleCandidates, navigationConfiguration.Name, navigationConfiguration.DeclaringEntityType.FullName, Name, String.Join(", ", matchingSets.Select(entitySet => entitySet.Name))); } }
public void PrincipalProperties_ReturnsEmpty_ByDefault() { // Arrange NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration( new MockPropertyInfo(), EdmMultiplicity.ZeroOrOne, new EntityTypeConfiguration()); // Act & Assert Assert.Empty(navigationProperty.PrincipalProperties); }
public void OnDeleteAction_Returns_NoneByDefault() { // Arrange NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(new MockPropertyInfo(), EdmMultiplicity.ZeroOrOne, new EntityTypeConfiguration()); // Act & Assert Assert.Equal(EdmOnDeleteAction.None, navigationProperty.OnDeleteAction); }
/// <summary> /// Finds the binding for the given navigation property and tries to create it if it doesnot exist. /// </summary> /// <param name="navigationConfiguration">The navigation property.</param> /// <returns>The <see cref="NavigationPropertyBindingConfiguration"/> so that it can be further configured.</returns> public virtual NavigationPropertyBindingConfiguration FindBinding(NavigationPropertyConfiguration navigationConfiguration) { return FindBinding(navigationConfiguration, autoCreate: true); }
/// <summary> /// Binds the given navigation property to the target navigation source. /// </summary> /// <param name="navigationConfiguration">The navigation property.</param> /// <param name="targetNavigationSource">The target navigation source.</param> /// <returns>The <see cref="NavigationPropertyBindingConfiguration"/> so that it can be further configured.</returns> public virtual NavigationPropertyBindingConfiguration AddBinding(NavigationPropertyConfiguration navigationConfiguration, INavigationSourceConfiguration targetNavigationSource) { if (navigationConfiguration == null) { throw Error.ArgumentNull("navigationConfiguration"); } if (targetNavigationSource == null) { throw Error.ArgumentNull("targetNavigationSource"); } EntityTypeConfiguration declaringEntityType = navigationConfiguration.DeclaringEntityType; if (!(declaringEntityType.IsAssignableFrom(EntityType) || EntityType.IsAssignableFrom(declaringEntityType))) { throw Error.Argument("navigationConfiguration", SRResources.NavigationPropertyNotInHierarchy, declaringEntityType.FullName, EntityType.FullName, Name); } NavigationPropertyBindingConfiguration navigationPropertyBinding; if (_navigationPropertyBindings.TryGetValue(navigationConfiguration, out navigationPropertyBinding)) { if (navigationPropertyBinding.TargetNavigationSource != targetNavigationSource) { throw Error.NotSupported(SRResources.RebindingNotSupported); } } else { navigationPropertyBinding = new NavigationPropertyBindingConfiguration(navigationConfiguration, targetNavigationSource); _navigationPropertyBindings[navigationConfiguration] = navigationPropertyBinding; } return navigationPropertyBinding; }
/// <summary> /// Adds a new EDM navigation property to this entity type. /// </summary> /// <param name="navigationProperty">The backing CLR property.</param> /// <param name="multiplicity">The <see cref="EdmMultiplicity"/> of the navigation property.</param> /// <returns>Returns the <see cref="NavigationPropertyConfiguration"/> of the added property.</returns> public virtual NavigationPropertyConfiguration AddNavigationProperty(PropertyInfo navigationProperty, EdmMultiplicity multiplicity) { if (navigationProperty == null) { throw Error.ArgumentNull("navigationProperty"); } if (!navigationProperty.ReflectedType.IsAssignableFrom(ClrType)) { throw Error.Argument("navigationProperty", SRResources.PropertyDoesNotBelongToType, navigationProperty.Name, ClrType.FullName); } ValidatePropertyNotAlreadyDefinedInBaseTypes(navigationProperty); ValidatePropertyNotAlreadyDefinedInDerivedTypes(navigationProperty); PropertyConfiguration propertyConfig; NavigationPropertyConfiguration navigationPropertyConfig; if (ExplicitProperties.ContainsKey(navigationProperty)) { propertyConfig = ExplicitProperties[navigationProperty]; if (propertyConfig.Kind != PropertyKind.Navigation) { throw Error.Argument("navigationProperty", SRResources.MustBeNavigationProperty, navigationProperty.Name, ClrType.FullName); } navigationPropertyConfig = propertyConfig as NavigationPropertyConfiguration; if (navigationPropertyConfig.Multiplicity != multiplicity) { throw Error.Argument("navigationProperty", SRResources.MustHaveMatchingMultiplicity, navigationProperty.Name, multiplicity); } } else { navigationPropertyConfig = new NavigationPropertyConfiguration(navigationProperty, multiplicity, this); ExplicitProperties[navigationProperty] = navigationPropertyConfig; // make sure the related type is configured ModelBuilder.AddEntity(navigationPropertyConfig.RelatedClrType); } return navigationPropertyConfig; }
public void HasConstraint_ThrowsArgumentNull_ForNullPrincipalPropertyInfo() { // Arrange NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(new MockPropertyInfo(), EdmMultiplicity.ZeroOrOne, new EntityTypeConfiguration()); // Act & Assert Assert.ThrowsArgumentNull( () => navigationProperty.HasConstraint(new MockPropertyInfo(), principalPropertyInfo: null), "principalPropertyInfo"); }
public void HasConstraint_Throws_MultiplicityMany() { // Arrange Mock<EntityTypeConfiguration> entityType = new Mock<EntityTypeConfiguration>(); entityType.Setup(c => c.ClrType).Returns(typeof(NavigationPropertyConfigurationTest)); NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration( new MockPropertyInfo(typeof(List<NavigationPropertyConfigurationTest>), "Navigation"), EdmMultiplicity.Many, entityType.Object); // Act & Assert Assert.Throws<NotSupportedException>( () => navigationProperty.HasConstraint(new MockPropertyInfo(), new MockPropertyInfo()), String.Format(SRResources.ReferentialConstraintOnManyNavigationPropertyNotSupported, "Navigation", typeof(NavigationPropertyConfigurationTest).FullName)); }
public void HasConstraint_Throws_ReferentialConstraintAlreadyConfigured_Principal() { // Arrange PropertyInfo principalPropertyInfo = typeof(Principal).GetProperty("PrincipalKey1"); PropertyInfo dependentPropertyInfo = typeof(Dependent).GetProperty("DependentKey1"); PropertyInfo otherPrincipalPropertyInfo = typeof(Dependent).GetProperty("DependentKey2"); ODataModelBuilder builder = new ODataModelBuilder(); builder.AddEntityType(typeof(Principal)); EntityTypeConfiguration dependentEntity = builder.AddEntityType(typeof(Dependent)); NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One, dependentEntity); navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo); // Act & Assert Assert.Throws<InvalidOperationException>( () => navigationProperty.HasConstraint(otherPrincipalPropertyInfo, principalPropertyInfo), String.Format(SRResources.ReferentialConstraintAlreadyConfigured, "principal", "PrincipalKey1", "dependent", "DependentKey1")); }
public void Ctor_MultiplicityProperty_IsInitializedProperly() { NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(new MockPropertyInfo(), EdmMultiplicity.ZeroOrOne, new EntityTypeConfiguration()); Assert.Equal(EdmMultiplicity.ZeroOrOne, navigationProperty.Multiplicity); }
public void NonContained_ModifiesContainsTargetToFalse() { // Arrange NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration( new MockPropertyInfo(), EdmMultiplicity.ZeroOrOne, new EntityTypeConfiguration()); // Act navigationProperty.Contained().NonContained(); // Assert Assert.False(navigationProperty.ContainsTarget); }
private NavigationPropertyConfiguration AddNavigationProperty(PropertyInfo navigationProperty, EdmMultiplicity multiplicity, bool containsTarget) { if (navigationProperty == null) { throw Error.ArgumentNull("navigationProperty"); } if (!navigationProperty.ReflectedType.IsAssignableFrom(ClrType)) { throw Error.Argument("navigationProperty", SRResources.PropertyDoesNotBelongToType, navigationProperty.Name, ClrType.FullName); } if (navigationProperty.PropertyType == typeof(IEnumerable<DateTime>) || navigationProperty.PropertyType == typeof(IEnumerable<DateTime?>) || navigationProperty.PropertyType == typeof(DateTime) || navigationProperty.PropertyType == typeof(DateTime?)) { throw Error.Argument("navigationProperty", SRResources.DateTimeTypePropertyNotSupported, navigationProperty.PropertyType.FullName, navigationProperty.Name, navigationProperty.DeclaringType.FullName, typeof(DateTimeOffset).FullName, typeof(ODataModelBuilder).FullName); } ValidatePropertyNotAlreadyDefinedInBaseTypes(navigationProperty); ValidatePropertyNotAlreadyDefinedInDerivedTypes(navigationProperty); PropertyConfiguration propertyConfig; NavigationPropertyConfiguration navigationPropertyConfig; if (ExplicitProperties.ContainsKey(navigationProperty)) { propertyConfig = ExplicitProperties[navigationProperty]; if (propertyConfig.Kind != PropertyKind.Navigation) { throw Error.Argument("navigationProperty", SRResources.MustBeNavigationProperty, navigationProperty.Name, ClrType.FullName); } navigationPropertyConfig = propertyConfig as NavigationPropertyConfiguration; if (navigationPropertyConfig.Multiplicity != multiplicity) { throw Error.Argument("navigationProperty", SRResources.MustHaveMatchingMultiplicity, navigationProperty.Name, multiplicity); } } else { navigationPropertyConfig = new NavigationPropertyConfiguration( navigationProperty, multiplicity, this); if (containsTarget) { navigationPropertyConfig = navigationPropertyConfig.Contained(); } ExplicitProperties[navigationProperty] = navigationPropertyConfig; // make sure the related type is configured ModelBuilder.AddEntityType(navigationPropertyConfig.RelatedClrType); } return navigationPropertyConfig; }
/// <summary> /// Finds the <see cref="NavigationPropertyBindingConfiguration"/> for the given navigation property. /// </summary> /// <param name="navigationConfiguration">The navigation property.</param> /// <param name="autoCreate">Represents a value specifying if the binding should be created if it is not found.</param> /// <returns>The binding if found.</returns> public NavigationPropertyBindingConfiguration FindBinding(NavigationPropertyConfiguration navigationConfiguration, bool autoCreate) { return(_configuration.FindBinding(navigationConfiguration, autoCreate)); }
public void ContainsTarget_DefaultsToFalse() { // Arrange & Act NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration( new MockPropertyInfo(), EdmMultiplicity.ZeroOrOne, new EntityTypeConfiguration()); // Assert Assert.False(navigationProperty.ContainsTarget); }
/// <summary> /// Initializes a new instance of the <see cref="NavigationPropertyQueryableConfiguration"/> class. /// </summary> /// <param name="propertyConfiguration">The NavigationPropertyConfiguration containing queryable configuration.</param> public NavigationPropertyQueryableConfiguration(NavigationPropertyConfiguration propertyConfiguration) { AutoExpand = propertyConfiguration.Expand; }
/// <summary> /// Gets the builder used to generate navigation link for the given navigation property for this navigation source. /// </summary> /// <param name="navigationProperty">The navigation property.</param> /// <returns>The link builder.</returns> public virtual NavigationLinkBuilder GetNavigationPropertyLink(NavigationPropertyConfiguration navigationProperty) { if (navigationProperty == null) { throw Error.ArgumentNull("navigationProperty"); } NavigationLinkBuilder navigationPropertyLinkBuilder; _navigationPropertyLinkBuilders.TryGetValue(navigationProperty, out navigationPropertyLinkBuilder); return navigationPropertyLinkBuilder; }
/// <summary> /// Configures the navigation link for the given navigation property for this navigation source. /// </summary> /// <param name="navigationProperty">The navigation property for which the navigation link is being generated.</param> /// <param name="navigationLinkBuilder">The builder used to generate the navigation link.</param> /// <returns>Returns itself so that multiple calls can be chained.</returns> public virtual INavigationSourceConfiguration HasNavigationPropertyLink(NavigationPropertyConfiguration navigationProperty, NavigationLinkBuilder navigationLinkBuilder) { if (navigationProperty == null) { throw Error.ArgumentNull("navigationProperty"); } if (navigationLinkBuilder == null) { throw Error.ArgumentNull("navigationLinkBuilder"); } EntityTypeConfiguration declaringEntityType = navigationProperty.DeclaringEntityType; if (!(declaringEntityType.IsAssignableFrom(EntityType) || EntityType.IsAssignableFrom(declaringEntityType))) { throw Error.Argument("navigationProperty", SRResources.NavigationPropertyNotInHierarchy, declaringEntityType.FullName, EntityType.FullName, Name); } _navigationPropertyLinkBuilders[navigationProperty] = navigationLinkBuilder; return this; }
/// <summary> /// Removes the binding for the given navigation property. /// </summary> /// <param name="navigationConfiguration">The navigation property</param> public virtual void RemoveBinding(NavigationPropertyConfiguration navigationConfiguration) { if (_entitySetBindings.ContainsKey(navigationConfiguration)) { _entitySetBindings.Remove(navigationConfiguration); } }
/// <summary> /// Removes the binding for the given navigation property. /// </summary> /// <param name="navigationConfiguration">The navigation property</param> public virtual void RemoveBinding(NavigationPropertyConfiguration navigationConfiguration) { if (navigationConfiguration == null) { throw Error.ArgumentNull("navigationConfiguration"); } _navigationPropertyBindings.Remove(navigationConfiguration); }
public void HasConstraint_Throws_ReferentialConstraintPropertyTypeNotValid() { // Arrange PropertyInfo principalPropertyInfo = typeof(Principal).GetProperty("MockPrincipal"); PropertyInfo dependentPropertyInfo = typeof(Dependent).GetProperty("MockDependent"); ODataModelBuilder builder = new ODataModelBuilder(); builder.AddEntityType(typeof(Principal)); EntityTypeConfiguration dependentEntity = builder.AddEntityType(typeof(Dependent)); NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One, dependentEntity); // Act & Assert Assert.Throws<InvalidOperationException>( () => navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo), String.Format(SRResources.ReferentialConstraintPropertyTypeNotValid, "System.Web.OData.MockType")); }
/// <summary> /// Finds the binding for the given navigation property. /// </summary> /// <param name="autoCreate">Tells whether the binding should be auto created if it does not exist.</param> /// <param name="navigationConfiguration">The navigation property.</param> /// <returns>The <see cref="NavigationPropertyBindingConfiguration"/> so that it can be further configured.</returns> public virtual NavigationPropertyBindingConfiguration FindBinding(NavigationPropertyConfiguration navigationConfiguration, bool autoCreate) { if (navigationConfiguration == null) { throw Error.ArgumentNull("navigationConfiguration"); } NavigationPropertyBindingConfiguration bindingConfiguration; if (_navigationPropertyBindings.TryGetValue(navigationConfiguration, out bindingConfiguration)) { return bindingConfiguration; } if (!autoCreate) { return null; } bool hasSingletonAttribute = navigationConfiguration.PropertyInfo.GetCustomAttributes<SingletonAttribute>().Any(); Type entityType = navigationConfiguration.RelatedClrType; INavigationSourceConfiguration[] matchedNavigationSources; if (hasSingletonAttribute) { matchedNavigationSources = _modelBuilder.Singletons.Where(es => es.EntityType.ClrType == entityType).ToArray(); } else { matchedNavigationSources = _modelBuilder.EntitySets.Where(es => es.EntityType.ClrType == entityType).ToArray(); } if (matchedNavigationSources.Length == 1) { return AddBinding(navigationConfiguration, matchedNavigationSources[0]); } else if (matchedNavigationSources.Length == 0) { return null; } else { throw Error.NotSupported( SRResources.CannotAutoCreateMultipleCandidates, navigationConfiguration.Name, navigationConfiguration.DeclaringEntityType.FullName, Name, String.Join(", ", matchedNavigationSources.Select(s => s.Name))); } }
/// <summary> /// Initializes a new instance of the <see cref="NavigationPropertyBindingConfiguration"/> class. /// </summary> /// <param name="navigationProperty">The navigation property for the binding.</param> /// <param name="navigationSource">The target navigation source of the binding.</param> public NavigationPropertyBindingConfiguration(NavigationPropertyConfiguration navigationProperty, NavigationSourceConfiguration navigationSource) : this(navigationProperty, navigationSource, new MemberInfo[] { navigationProperty.PropertyInfo }) { }
/// <summary> /// Finds the binding for the given navigation property and tries to create it if it doesnot exist. /// </summary> /// <param name="navigationConfiguration">The navigation property.</param> /// <returns>The <see cref="NavigationPropertyBindingConfiguration"/> so that it can be further configured.</returns> public virtual NavigationPropertyBindingConfiguration FindBinding(NavigationPropertyConfiguration navigationConfiguration) { return(FindBinding(navigationConfiguration, autoCreate: true)); }
/// <summary> /// Binds the given navigation property to the target entity set. /// </summary> /// <param name="navigationConfiguration">The navigation property.</param> /// <param name="targetEntitySet">The target entity set.</param> /// <returns>The <see cref="NavigationPropertyBindingConfiguration"/> so that it can be further configured.</returns> public virtual NavigationPropertyBindingConfiguration AddBinding(NavigationPropertyConfiguration navigationConfiguration, EntitySetConfiguration targetEntitySet) { if (navigationConfiguration == null) { throw Error.ArgumentNull("navigationConfiguration"); } if (targetEntitySet == null) { throw Error.ArgumentNull("targetEntitySet"); } EntityTypeConfiguration declaringEntityType = navigationConfiguration.DeclaringEntityType; if (!(declaringEntityType.IsAssignableFrom(EntityType) || EntityType.IsAssignableFrom(declaringEntityType))) { throw Error.Argument("navigationConfiguration", SRResources.NavigationPropertyNotInHierarchy, declaringEntityType.FullName, EntityType.FullName, Name); } NavigationPropertyBindingConfiguration navigationPropertyBinding = null; if (_entitySetBindings.ContainsKey(navigationConfiguration)) { navigationPropertyBinding = _entitySetBindings[navigationConfiguration]; if (navigationPropertyBinding.EntitySet != targetEntitySet) { throw Error.NotSupported(SRResources.RebindingNotSupported); } } else { navigationPropertyBinding = new NavigationPropertyBindingConfiguration(navigationConfiguration, targetEntitySet); _entitySetBindings[navigationConfiguration] = navigationPropertyBinding; } return navigationPropertyBinding; }
public void HasConstraint_CanSetDependentAndPrincipalProperty_OnlyOnceForTheSameConstraint() { // Arrange PropertyInfo principalPropertyInfo = typeof(Principal).GetProperty("PrincipalKey1"); PropertyInfo dependentPropertyInfo = typeof(Dependent).GetProperty("DependentKey1"); ODataModelBuilder builder = new ODataModelBuilder(); builder.AddEntityType(typeof(Principal)); EntityTypeConfiguration dependentEntity = builder.AddEntityType(typeof(Dependent)); NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One, dependentEntity); // Act navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo); navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo); navigationProperty.HasConstraint(new KeyValuePair<PropertyInfo, PropertyInfo>(dependentPropertyInfo, principalPropertyInfo)); // Assert Assert.Single(navigationProperty.PrincipalProperties); Assert.Single(navigationProperty.DependentProperties); }
public void CascadeOnDelete_ModifiesOnDelete_WithParameter() { // Arrange NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(new MockPropertyInfo(), EdmMultiplicity.ZeroOrOne, new EntityTypeConfiguration()); // Act navigationProperty.CascadeOnDelete(cascade: false); // Assert Assert.Equal(EdmOnDeleteAction.None, navigationProperty.OnDeleteAction); }
public void Ctor_MultiplicityProperty_IsInitializedProperly() { NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(new MockPropertyInfo(), EdmMultiplicity.ZeroOrOne, new EntityTypeConfiguration()); Assert.Equal(EdmMultiplicity.ZeroOrOne, navigationProperty.Multiplicity); }
public void HasConstraint_Throws_DependentAndPrincipalTypeNotMatch() { // Arrange PropertyInfo principalPropertyInfo = typeof(Principal).GetProperty("PrincipalKey2"); PropertyInfo dependentPropertyInfo = typeof(Dependent).GetProperty("DependentKey1"); ODataModelBuilder builder = new ODataModelBuilder(); builder.AddEntityType(typeof(Principal)); EntityTypeConfiguration dependentEntity = builder.AddEntityType(typeof(Dependent)); NavigationPropertyConfiguration navigationProperty = new NavigationPropertyConfiguration(typeof(Dependent).GetProperty("Principal"), EdmMultiplicity.One, dependentEntity); // Act & Assert Assert.Throws<InvalidOperationException>( () => navigationProperty.HasConstraint(dependentPropertyInfo, principalPropertyInfo), String.Format(SRResources.DependentAndPrincipalTypeNotMatch, "System.Int32", "System.String")); }