public void OnEntityTypeAdded_calls_apply_on_conventions()
        {
            var model = new Model();
            var builder = new ConventionModelBuilder(model);
            builder.Conventions.Clear();
            var convention = new Mock<IModelConvention>();
            builder.Conventions.Add(convention.Object);

            builder.Entity<Entity>();

            convention.Verify(c => c.Apply(It.Is<EntityType>(t => t.Type == typeof(Entity))));
        }
        public void OnEntityTypeAdded_calls_apply_on_conventions()
        {
            var model   = new Model();
            var builder = new ConventionModelBuilder(model);

            builder.Conventions.Clear();
            var convention = new Mock <IModelConvention>();

            builder.Conventions.Add(convention.Object);

            builder.Entity <Entity>();

            convention.Verify(c => c.Apply(It.Is <EntityType>(t => t.Type == typeof(Entity))));
        }
        private static IModel BuildModel(
            bool createProducts = true, bool createCategory = true,
            bool createFeaturedProductCategory = true, bool createFeaturedProduct = true)
        {
            var model   = new Model();
            var builder = new ConventionModelBuilder(model);

            builder.Entity <Product>();
            builder.Entity <Category>();

            var categoryType = model.GetEntityType(typeof(Category));
            var productType  = model.GetEntityType(typeof(Product));

            var categoryFk        = productType.AddForeignKey(categoryType.GetKey(), productType.GetProperty("CategoryId"));
            var featuredProductFk = categoryType.AddForeignKey(productType.GetKey(), categoryType.GetProperty("FeaturedProductId"));

            featuredProductFk.IsUnique = true;

            if (createProducts)
            {
                categoryType.AddNavigation(new Navigation(categoryFk, "Products", pointsToPrincipal: false));
            }
            if (createCategory)
            {
                productType.AddNavigation(new Navigation(categoryFk, "Category", pointsToPrincipal: true));
            }

            if (createFeaturedProductCategory)
            {
                productType.AddNavigation(new Navigation(featuredProductFk, "FeaturedProductCategory", pointsToPrincipal: false));
            }
            if (createFeaturedProduct)
            {
                categoryType.AddNavigation(new Navigation(featuredProductFk, "FeaturedProduct", pointsToPrincipal: true));
            }

            return(model);
        }
        private static IModel BuildModel(
            bool createProducts = true, bool createCategory = true,
            bool createFeaturedProductCategory = true, bool createFeaturedProduct = true)
        {
            var model = new Model();
            var builder = new ConventionModelBuilder(model);

            builder.Entity<Product>();
            builder.Entity<Category>();

            var categoryType = model.GetEntityType(typeof(Category));
            var productType = model.GetEntityType(typeof(Product));

            var categoryFk = productType.AddForeignKey(categoryType.GetKey(), productType.GetProperty("CategoryId"));
            var featuredProductFk = categoryType.AddForeignKey(productType.GetKey(), categoryType.GetProperty("FeaturedProductId"));
            featuredProductFk.IsUnique = true;

            if (createProducts)
            {
                categoryType.AddNavigation(new Navigation(categoryFk, "Products", pointsToPrincipal: false));
            }
            if (createCategory)
            {
                productType.AddNavigation(new Navigation(categoryFk, "Category", pointsToPrincipal: true));
            }

            if (createFeaturedProductCategory)
            {
                productType.AddNavigation(new Navigation(featuredProductFk, "FeaturedProductCategory", pointsToPrincipal: false));
            }
            if (createFeaturedProduct)
            {
                categoryType.AddNavigation(new Navigation(featuredProductFk, "FeaturedProduct", pointsToPrincipal: true));
            }

            return model;
        }
        private static IModel BuildModel()
        {
            var model = new Model();
            var builder = new ConventionModelBuilder(model);

            builder.Entity<Product>();
            builder.Entity<Category>();

            var productType = model.GetEntityType(typeof(Product));
            var categoryType = model.GetEntityType(typeof(Category));

            categoryType.GetProperty("Id").ValueGenerationOnAdd = ValueGenerationOnAdd.None;

            productType.AddForeignKey(new Key(new[] { categoryType.GetProperty("PrincipalId") }), productType.GetProperty("DependentId"));

            return model;
        }
        private static IModel BuildModel()
        {
            var model = new Model();
            var builder = new ConventionModelBuilder(model);

            builder.Entity<Product>();
            builder.Entity<Category>();
            builder.Entity<Dogegory>();

            var productType = model.GetEntityType(typeof(Product));
            var categoryType = model.GetEntityType(typeof(Category));

            productType.AddForeignKey(new Key(new[] { categoryType.GetProperty("PrincipalId") }), productType.GetProperty("DependentId"));

            var locationType = new EntityType("Location");
            var idProperty = locationType.AddProperty("Id", typeof(int), shadowProperty: true, concurrencyToken: false);
            locationType.AddProperty("Planet", typeof(string), shadowProperty: true, concurrencyToken: false);
            locationType.SetKey(idProperty);
            model.AddEntityType(locationType);

            return model;
        }
Example #7
0
        // TODO: convert to OnModelCreated
        public static ModelBuilder CreateModel()
        {
            var model = new Model();
            var modelBuilder = new ConventionModelBuilder(model);

            // TODO: Uncomment when complex types are supported
            //builder.ComplexType<Location>();
            modelBuilder
                .Entity<Chassis>()
                .Key(c => c.TeamId);

            modelBuilder
                .Entity<Driver>(ps =>
                    {
                        ps.Key(d => d.Id);
                        ps.Property(d => d.CarNumber);
                        ps.Property(d => d.Championships);
                        ps.Property(d => d.FastestLaps);
                        ps.Property(d => d.Name);
                        ps.Property(d => d.Podiums);
                        ps.Property(d => d.Poles);
                        ps.Property(d => d.Races);
                        ps.Property(d => d.TeamId);
                        ps.Property(d => d.Wins);
                    });

            modelBuilder
                .Entity<Engine>()
                .Key(e => e.Id);

            // TODO: Complex type
            // .Property(c => c.StorageLocation);

            modelBuilder.Entity<EngineSupplier>(b =>
                {
                    b.Key(e => e.Id);
                    b.Property(e => e.Name);
                });

            modelBuilder
                .Entity<Gearbox>(ps =>
                    {
                        ps.Key(g => g.Id);
                        ps.Property(g => g.Name);
                        ps.Property<int>("EngineId", shadowProperty: true);
                    });

            // TODO: Complex type
            //builder
            //    .ComplexType<Location>()
            //    .Properties(ps =>
            //        {
            //            // TODO: Use lambda expression
            //            ps.Property<double>("Latitude", concurrencyToken: true);
            //            // TODO: Use lambda expression
            //            ps.Property<double>("Longitude", concurrencyToken: true);
            //        });

            modelBuilder.Entity<Sponsor>(b =>
                {
                    b.Key(s => s.Id);
                    b.Property(s => s.Name);
                });

            // TODO: Complex type
            //builder
            //    .ComplexType<SponsorDetails>()
            //    .Properties(ps =>
            //        {
            //            ps.Property(s => s.Days);
            //            ps.Property(s => s.Space);
            //        });

            modelBuilder
                .Entity<Team>(ps =>
                    {
                        ps.Key(t => t.Id);
                        ps.Property(t => t.Constructor);
                        ps.Property(t => t.ConstructorsChampionships);
                        ps.Property(t => t.DriversChampionships);
                        ps.Property<int>("EngineId", shadowProperty: true);
                        ps.Property(t => t.FastestLaps);
                        ps.Property(t => t.GearboxId);
                        ps.Property(t => t.Name);
                        ps.Property(t => t.Poles);
                        ps.Property(t => t.Principal);
                        ps.Property(t => t.Races);
                        ps.Property(t => t.Tire);
                        ps.Property(t => t.Victories);
                    });

            modelBuilder
                .Entity<TestDriver>()
                .Key(t => t.Id);

            modelBuilder
                .Entity<TitleSponsor>();
            // TODO: Complex type
            // .Property(t => t.Details);

            var chassisType = model.GetEntityType(typeof(Chassis));
            var driverType = model.GetEntityType(typeof(Driver));
            var engineType = model.GetEntityType(typeof(Engine));
            var engineSupplierType = model.GetEntityType(typeof(EngineSupplier));
            var gearboxType = model.GetEntityType(typeof(Gearbox));
            var teamType = model.GetEntityType(typeof(Team));
            var sponsorType = model.GetEntityType(typeof(Sponsor));

            // TODO: Use FAPIS when available
            // TODO: Sponsor * <-> * Team

            {
                // Team * <-> 1 Engine
                var teamEngineIdFk = teamType.AddForeignKey(engineType.GetKey(), teamType.GetProperty("EngineId"));
                teamType.AddNavigation(new Navigation(teamEngineIdFk, "Engine", pointsToPrincipal: true));
                engineType.AddNavigation(new Navigation(teamEngineIdFk, "Teams", pointsToPrincipal: false));
            }

            {
                // Team -> 1? Gearbox
                var teamGearboxIdFk = teamType.AddForeignKey(gearboxType.GetKey(), teamType.GetProperty("GearboxId"));
                teamType.AddNavigation(new Navigation(teamGearboxIdFk, "Gearbox", pointsToPrincipal: true));
            }

            {
                // Driver * <-> 1 Team
                var driverTeamIdFk = driverType.AddForeignKey(teamType.GetKey(), driverType.GetProperty("TeamId"));
                driverType.AddNavigation(new Navigation(driverTeamIdFk, "Team", pointsToPrincipal: true));
                teamType.AddNavigation(new Navigation(driverTeamIdFk, "Drivers", pointsToPrincipal: false));
            }

            {
                // Engine * <-> 1 EngineSupplier
                var engineEngineSupplierIdFk = engineType.AddForeignKey(engineSupplierType.GetKey(), engineType.GetProperty("EngineSupplierId"));
                engineType.AddNavigation(new Navigation(engineEngineSupplierIdFk, "EngineSupplier", pointsToPrincipal: true));
                engineSupplierType.AddNavigation(new Navigation(engineEngineSupplierIdFk, "Engines", pointsToPrincipal: false));
            }

            {
                // Engine -> * Gearbox
                var gearboxEngineIdFk = gearboxType.AddForeignKey(engineType.GetKey(), gearboxType.GetProperty("EngineId"));
                engineType.AddNavigation(new Navigation(gearboxEngineIdFk, "Gearboxes", pointsToPrincipal: false));
            }

            // TODO: Remove once temporary keys can be overridden
            teamType.GetProperty("Id").ValueGenerationOnAdd = ValueGenerationOnAdd.None;
            teamType.GetProperty("Id").ValueGenerationOnSave = ValueGenerationOnSave.None;

            // TODO: Remove when FAPI supports this
            teamType.GetProperty("EngineId").IsNullable = true;
            engineType.AddProperty("EngineSupplierId", typeof(int), shadowProperty: false, concurrencyToken: true);
            engineType.AddProperty("Name", typeof(string), shadowProperty: false, concurrencyToken: true);
            chassisType.AddProperty("Version", typeof(byte[]), shadowProperty: false, concurrencyToken: true)
                .ValueGenerationOnSave = ValueGenerationOnSave.WhenInsertingAndUpdating;
            driverType.AddProperty("Version", typeof(byte[]), shadowProperty: false, concurrencyToken: true)
                .ValueGenerationOnSave = ValueGenerationOnSave.WhenInsertingAndUpdating;
            teamType.AddProperty("Version", typeof(byte[]), shadowProperty: false, concurrencyToken: true)
                .ValueGenerationOnSave = ValueGenerationOnSave.WhenInsertingAndUpdating;
            sponsorType.AddProperty("Version", typeof(byte[]), shadowProperty: false, concurrencyToken: true)
                .ValueGenerationOnSave = ValueGenerationOnSave.WhenInsertingAndUpdating;

            return modelBuilder;
        }
        private static IModel BuildModel()
        {
            var model = new Model();
            var builder = new ConventionModelBuilder(model);

            builder.Entity<Product>();
            builder.Entity<Category>();
            builder.Entity<ProductDetail>();
            builder.Entity<Order>();
            builder.Entity<OrderLine>().Key(e => new { e.OrderId, e.ProductId });
            builder.Entity<OrderLineDetail>().Key(e => new { e.OrderId, e.ProductId });

            var categoryType = model.GetEntityType(typeof(Category));
            var productType = model.GetEntityType(typeof(Product));
            var productDetailType = model.GetEntityType(typeof(ProductDetail));
            var orderType = model.GetEntityType(typeof(Order));
            var orderLineType = model.GetEntityType(typeof(OrderLine));
            var orderLineDetailType = model.GetEntityType(typeof(OrderLineDetail));

            var categoryFk = productType.AddForeignKey(categoryType.GetKey(), productType.GetProperty("CategoryId"));
            var productDetailFk = productDetailType.AddForeignKey(productType.GetKey(), productDetailType.GetProperty("Id"));
            productDetailFk.IsUnique = true;

            var orderFk = orderLineType.AddForeignKey(orderType.GetKey(), orderLineType.GetProperty("OrderId"));
            var productFk = orderLineType.AddForeignKey(productType.GetKey(), orderLineType.GetProperty("ProductId"));
            var orderLineFk = orderLineDetailType.AddForeignKey(orderLineType.GetKey(), orderLineDetailType.GetProperty("OrderId"), orderLineDetailType.GetProperty("ProductId"));
            orderLineFk.IsUnique = true;

            categoryType.AddNavigation(new Navigation(categoryFk, "Products", pointsToPrincipal: false));
            productType.AddNavigation(new Navigation(categoryFk, "Category", pointsToPrincipal: true));

            productDetailType.AddNavigation(new Navigation(productDetailFk, "Product", pointsToPrincipal: true));
            productType.AddNavigation(new Navigation(productDetailFk, "Detail", pointsToPrincipal: false));

            orderType.AddNavigation(new Navigation(orderFk, "OrderLines", pointsToPrincipal: false));
            orderLineType.AddNavigation(new Navigation(orderFk, "Order", pointsToPrincipal: true));

            productType.AddNavigation(new Navigation(productFk, "OrderLines", pointsToPrincipal: false));
            orderLineType.AddNavigation(new Navigation(productFk, "Product", pointsToPrincipal: true));

            orderLineType.AddNavigation(new Navigation(orderLineFk, "Detail", pointsToPrincipal: false));
            orderLineDetailType.AddNavigation(new Navigation(orderLineFk, "OrderLine", pointsToPrincipal: true));

            return model;
        }