public void GetEdmModel_ThrowsException_WithDifferentTypes() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); builder.Entity <MultiUser>() .HasKey(u => new { u.UserId1, u.UserId2 }); builder.Entity <MultiRole>() .HasRequired(r => r.User, (r, u) => r.UserKey2 == u.UserId2 && r.UserKey3 == u.UserId3); // Act & Assert Assert.Throws <InvalidOperationException>( () => builder.GetEdmModel(), String.Format(SRResources.DependentPropertiesNotMatchWithPrincipalKeys, "System.String,System.Guid", "System.Int32,System.String")); }
public void FailingToConfigureNavigationLinks_Results_In_InvalidOperationException_When_BuildingNavigationLink() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); builder.EntitySet <EntitySetLinkConfigurationTest_Product>("Products").HasManyBinding(p => p.Orders, "Orders"); var model = builder.GetEdmModel(); IEdmEntitySet products = model.EntityContainers().Single().EntitySets().Single(s => s.Name == "Products"); IEdmNavigationProperty ordersProperty = products.ElementType.DeclaredNavigationProperties().Single(); var linkBuilder = model.GetEntitySetLinkBuilder(products); // Act & Assert Assert.Throws <InvalidOperationException>( () => linkBuilder.BuildNavigationLink(new EntityInstanceContext(), ordersProperty), "No NavigationLink factory was found for the navigation property 'Orders' from entity type 'System.Web.Http.OData.Builder.EntitySetLinkConfigurationTest_Product' on entity set 'Products'. " + "Try calling HasNavigationPropertyLink on the EntitySetConfiguration."); }
public void BuilderIncludesMapFromEntityTypeToBindableProcedures() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration <Customer> customer = builder.EntitySet <Customer>("Customers").EntityType; customer.HasKey(c => c.Id); customer.Property(c => c.Name); customer.Action("Reward"); IEdmModel model = builder.GetEdmModel(); IEdmEntityType customerType = model.SchemaElements.OfType <IEdmEntityType>().SingleOrDefault(); // Act BindableProcedureFinder finder = model.GetAnnotationValue <BindableProcedureFinder>(model); // Assert Assert.NotNull(finder); Assert.NotNull(finder.FindProcedures(customerType).SingleOrDefault()); Assert.Equal("Reward", finder.FindProcedures(customerType).SingleOrDefault().Name); }
public void GetEdmModel_PropertyWithDatabaseAttribute_CannotSetStoreGeneratedPatternOnComplexType() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); builder.ComplexType <Customer>().Property(c => c.Name).HasStoreGeneratedPattern(DatabaseGeneratedOption.Computed); // Act IEdmModel model = builder.GetEdmModel(); // Assert IEdmComplexType type = model.AssertHasComplexType(typeof(Customer)); IEdmStructuralProperty property = type.AssertHasPrimitiveProperty(model, "Name", EdmPrimitiveTypeKind.String, isNullable: true); var idAnnotation = model.GetAnnotationValue <EdmStringConstant>( property, StoreGeneratedPatternAnnotation.AnnotationsNamespace, StoreGeneratedPatternAnnotation.AnnotationName); Assert.Null(idAnnotation); }
public void BuildNavigationLink(bool followsConventions, object metadataLevel, bool linkEmitted) { var navigationProperty = _entitySet.EntityType.AddNavigationProperty(typeof(Customer).GetProperty("Orders"), EdmMultiplicity.Many); IEdmModel model = _modelBuilder.GetEdmModel(); IEdmNavigationProperty edmNavProperty = model.GetEdmTypeReference(typeof(Customer)).AsEntity().DeclaredNavigationProperties().Single(p => p.Name == "Orders"); EntitySetLinkBuilderAnnotation linkBuilder = new EntitySetLinkBuilderAnnotation(_entitySet); linkBuilder.AddNavigationPropertyLinkBuilder(edmNavProperty, new NavigationLinkBuilder((context, property) => new Uri("http://navigationlink"), followsConventions)); Uri generatedNavigationLink = linkBuilder.BuildNavigationLink(new EntityInstanceContext(), edmNavProperty, (ODataMetadataLevel)metadataLevel); if (linkEmitted) { Assert.Equal("http://navigationlink/", generatedNavigationLink.AbsoluteUri); } else { Assert.Null(generatedNavigationLink); } }
public void CanConfigureAllLinksViaEditLink() { // Arrange ODataModelBuilder builder = GetCommonModel(); var expectedEditLink = "http://server/service/Products(15)"; var products = builder.EntitySet <EntitySetLinkConfigurationTest_Product>("Products"); products.HasEditLink(c => new Uri( string.Format( "http://server/service/Products({0})", c.EntityInstance.ID ) )); var actor = builder.EntitySets.Single(); var model = builder.GetEdmModel(); var productType = model.SchemaElements.OfType <IEdmEntityType>().Single(); var productsSet = model.SchemaElements.OfType <IEdmEntityContainer>().Single().EntitySets().Single(); var productInstance = new EntitySetLinkConfigurationTest_Product { ID = 15 }; var entityContext = new EntityInstanceContext { EdmModel = model, EntitySet = productsSet, EntityType = productType, EntityInstance = productInstance, UrlHelper = new UrlHelper(new HttpRequestMessage()) }; var entitySetLinkBuilderAnnotation = new EntitySetLinkBuilderAnnotation(actor); // Act var editLinkUri = entitySetLinkBuilderAnnotation.BuildEditLink(entityContext); var readLinkUri = entitySetLinkBuilderAnnotation.BuildReadLink(entityContext); var idLink = entitySetLinkBuilderAnnotation.BuildIdLink(entityContext); // Assert Assert.NotNull(editLinkUri); Assert.Equal(expectedEditLink, editLinkUri.ToString()); Assert.NotNull(readLinkUri); Assert.Equal(expectedEditLink, readLinkUri.ToString()); Assert.NotNull(idLink); Assert.Equal(expectedEditLink, idLink); }
public void CanDefinePropertyOnDerivedType_NotPresentInBaseEdmType_ButPresentInBaseClrType() { var builder = new ODataModelBuilder(); builder .Entity <Motorcycle>() .DerivesFrom <Vehicle>() .Property(m => m.Model); var model = builder.GetEdmModel(); var edmVehicle = model.AssertHasEntityType(typeof(Vehicle)); Assert.Null(edmVehicle.BaseEntityType()); Assert.Equal(0, edmVehicle.Properties().Count()); var edmMotorcycle = model.AssertHasEntityType(typeof(Motorcycle)); Assert.Equal(edmVehicle, edmMotorcycle.BaseEntityType()); Assert.Equal(1, edmMotorcycle.Properties().Count()); edmMotorcycle.AssertHasPrimitiveProperty(model, "Model", EdmPrimitiveTypeKind.Int32, isNullable: false); }
public void CanCreateEdmModel_WithTransientBindableAction() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration <Customer> customer = builder.Entity <Customer>(); customer.HasKey(c => c.CustomerId); customer.Property(c => c.Name); // Act ActionConfiguration sendEmail = customer.TransientAction("ActionName"); IEdmModel model = builder.GetEdmModel(); // Assert IEdmEntityContainer container = model.EntityContainers().SingleOrDefault(); Assert.NotNull(container); Assert.Equal(1, container.Elements.OfType <IEdmFunctionImport>().Count()); IEdmFunctionImport action = container.Elements.OfType <IEdmFunctionImport>().Single(); Assert.True(action.IsBindable); Assert.False(model.IsAlwaysBindable(action)); }
public void CanAddBinding_For_DerivedNavigationProperty() { ODataModelBuilder builder = new ODataModelBuilder(); var vehicle = builder.AddEntity(typeof(Vehicle)); var motorcycle = builder.AddEntity(typeof(Motorcycle)).DerivesFrom(vehicle); var manufacturer = builder.AddEntity(typeof(MotorcycleManufacturer)); var manufacturers = builder.AddEntitySet("manufacturers", manufacturer); var navProperty = motorcycle.AddNavigationProperty(typeof(Motorcycle).GetProperty("Manufacturer"), EdmMultiplicity.One); var vehicles = builder.AddEntitySet("vehicles", vehicle); vehicles.AddBinding(navProperty, manufacturers); IEdmModel model = builder.GetEdmModel(); var motorcycleEdmType = model.AssertHasEntityType(typeof(Motorcycle)); var edmNavProperty = motorcycleEdmType.AssertHasNavigationProperty(model, "Manufacturer", typeof(MotorcycleManufacturer), isNullable: false, multiplicity: EdmMultiplicity.One); Assert.Equal( "manufacturers", model.EntityContainers().Single().FindEntitySet("vehicles").FindNavigationTarget(edmNavProperty).Name); }
public void CanConfigureAllLinksViaIdLink() { // Arrange ODataModelBuilder builder = GetCommonModel(); var expectedEditLink = "http://server/service/Products(15)"; var products = builder.EntitySet <EntitySetLinkConfigurationTest_Product>("Products"); products.HasIdLink(c => string.Format( "http://server/service/Products({0})", c.GetPropertyValue("ID") ), followsConventions: false); var actor = builder.EntitySets.Single(); var model = builder.GetEdmModel(); var productType = model.SchemaElements.OfType <IEdmEntityType>().Single(); var productsSet = model.SchemaElements.OfType <IEdmEntityContainer>().Single().EntitySets().Single(); var productInstance = new EntitySetLinkConfigurationTest_Product { ID = 15 }; var serializerContext = new ODataSerializerContext { Model = model, EntitySet = productsSet }; var entityContext = new EntityInstanceContext(serializerContext, productType.AsReference(), productInstance); var entitySetLinkBuilderAnnotation = new EntitySetLinkBuilderAnnotation(actor); // Act var selfLinks = entitySetLinkBuilderAnnotation.BuildEntitySelfLinks(entityContext, ODataMetadataLevel.Default); // Assert Assert.NotNull(selfLinks.EditLink); Assert.Equal(expectedEditLink, selfLinks.EditLink.ToString()); Assert.NotNull(selfLinks.ReadLink); Assert.Equal(expectedEditLink, selfLinks.ReadLink.ToString()); Assert.NotNull(selfLinks.IdLink); Assert.Equal(expectedEditLink, selfLinks.IdLink); }
public void GetEdmModel_Works_WithMultiForeignKeys() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration <MultiUser> userType = builder.Entity <MultiUser>(); userType.HasKey(u => new { u.UserId1, u.UserId2 }) .HasMany(u => u.Roles); EntityTypeConfiguration <MultiRole> roleType = builder.Entity <MultiRole>(); roleType.HasKey(r => r.RoleId) .HasOptional(r => r.User, (r, u) => r.UserKey1 == u.UserId1 && r.UserKey2 == u.UserId2) .CascadeOnDelete(); // Act IEdmModel model = builder.GetEdmModel(); // Assert Assert.NotNull(model); IEdmEntityType roleEntityType = model.AssertHasEntityType(typeof(MultiRole)); IEdmNavigationProperty usersNav = roleEntityType.AssertHasNavigationProperty(model, "User", typeof(MultiUser), true, EdmMultiplicity.ZeroOrOne); Assert.Equal(EdmOnDeleteAction.Cascade, usersNav.OnDelete); Assert.Equal(2, usersNav.DependentProperties.Count()); Assert.Equal("UserKey1", usersNav.DependentProperties.First().Name); Assert.Equal("UserKey2", usersNav.DependentProperties.Last().Name); IEdmProperty edmProperty = Assert.Single(roleEntityType.Properties().Where(c => c.Name == "UserKey1")); Assert.False(edmProperty.Type.IsNullable); edmProperty = Assert.Single(roleEntityType.Properties().Where(c => c.Name == "UserKey2")); Assert.False(edmProperty.Type.IsNullable); }
public void GetEdmModel_PropertyWithConcurrency_IsConcurrencyToken() { // Arrange var builder = new ODataModelBuilder(); builder.Entity <Customer>().Property(c => c.Name).IsConcurrencyToken(); builder.Entity <Customer>().Property(c => c.Id); // Act var model = builder.GetEdmModel(); // Assert IEdmEntityType type = model.AssertHasEntityType(typeof(Customer)); IEdmStructuralProperty nameProperty = type.AssertHasPrimitiveProperty(model, "Name", EdmPrimitiveTypeKind.String, isNullable: true); Assert.Equal(EdmConcurrencyMode.Fixed, nameProperty.ConcurrencyMode); IEdmStructuralProperty idProperty = type.AssertHasPrimitiveProperty(model, "Id", EdmPrimitiveTypeKind.Int32, isNullable: false); Assert.Equal(EdmConcurrencyMode.None, idProperty.ConcurrencyMode); }
public void GetEdmModel_SetsNullableIffParameterTypeIsNullable() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); EntityTypeConfiguration <Movie> movie = builder.EntitySet <Movie>("Movies").EntityType; var actionBuilder = movie.Action("Watch"); actionBuilder.Parameter <int>("int"); actionBuilder.Parameter <Nullable <int> >("nullableOfInt"); actionBuilder.Parameter <DateTime>("dateTime"); actionBuilder.Parameter <string>("string"); // Act IEdmModel model = builder.GetEdmModel(); //Assert IEdmEntityContainer container = model.SchemaElements.OfType <IEdmEntityContainer>().SingleOrDefault(); IEdmFunctionImport action = container.FindFunctionImports("Watch").Single(); Assert.False(action.FindParameter("int").Type.IsNullable); Assert.True(action.FindParameter("nullableOfInt").Type.IsNullable); Assert.False(action.FindParameter("dateTime").Type.IsNullable); Assert.True(action.FindParameter("string").Type.IsNullable); }