Cascade Saves with Fluent NHibernate AutoMapping - Old Answer Still Valid?

前端 未结 3 457
离开以前
离开以前 2020-12-29 14:15

I want to do exactly what this question asks: Cascade Saves with Fluent NHibernate AutoMapping

Using Fluent Nhibernate Mappings to turn on \"cascade\" globally once

3条回答
  •  误落风尘
    2020-12-29 14:43

    Here's a full working example similar to the Getting Started guide https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started

        //=====CONSOLE MAIN
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
    
        using FluentNHibernate.Cfg;
        using FluentNHibernate.Cfg.Db;
        using NHibernate;
        using NHibernate.Cfg;
        using NHibernate.Tool.hbm2ddl;
        using System.IO;
        using FluentNHibernate.Automapping;
        using App4.Entities;
        using System.Diagnostics;
    
        namespace App4
        {
            class Program
            {
                static void Main(string[] args)
                {
                    // create our NHibernate session factory
                    var sessionFactory = CreateSessionFactory();
    
                    using (var session = sessionFactory.OpenSession())
                    {
                        // populate the database
                        using (var transaction = session.BeginTransaction())
                        {
                            // create a couple of Stores each with some Products and Employees
                            var topShelf = new Shelf();
                            var sw = new Stopwatch();
                            sw.Start();
                            for (var i = 0; i < 1000; i++)
                            {
                                var potatoes = new Product { Name = "Potatoes" + i.ToString(), Price = 3.60 + i };
                                var meat = new Product { Name = "Meat" + i.ToString(), Price = 4.49 + i };
                                //session.SaveOrUpdate(potatoes); //===<();
    
                            foreach (var store in shelves)
                            {
                                WriteShelfPretty(store);
                            }
                        }
                    }
    
                    Console.ReadLine();
                }
    
                private const string DbFile = "FIVEProgram.db";
                private static ISessionFactory CreateSessionFactory()
                {
                    return Fluently.Configure()
                      .Database(SQLiteConfiguration.Standard.UsingFile(DbFile))
                      .Mappings(m => m.AutoMappings
                            .Add(AutoMap.AssemblyOf(type => type.Namespace.EndsWith("Entities"))
                                    .Override(map =>
                                    {
                                        map.HasManyToMany(x => x.Products);//.Cascade.All();
                                    })
                                    .Conventions.AddFromAssemblyOf()
                                 )
    
                          ) //emd mappings
                    .ExposeConfiguration(BuildSchema)//Delete and remake db (see function below)
                    .BuildSessionFactory();//finalizes the whole thing to send back. 
    
                }
    
                private static void BuildSchema(Configuration config)
                {
                    // delete the existing db on each run
                    if (File.Exists(DbFile))
                        File.Delete(DbFile);
    
                    // this NHibernate tool takes a configuration (with mapping info in)
                    // and exports a database schema from it
                    new SchemaExport(config)
                        .Create(false, true);
                }
    
                private static void WriteShelfPretty(Shelf shelf)
                {
                    Console.WriteLine(shelf.Id);
                    Console.WriteLine("  Products:");
    
                    foreach (var product in shelf.Products)
                    {
                        Console.WriteLine("    " + product.Name);
                    }
    
                    Console.WriteLine();
                }
    
            }
    
    
    
        }
    
    
    //Data Classes
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace App4.Entities 
    {
        public class Product
        {
            public virtual int Id { get; private set; }
            public virtual string Name { get; set; }
            public virtual double Price { get; set; }
        }
    
        public class Shelf
        {
            public virtual int Id { get; private set; }
            public virtual IList Products { get; private set; }
    
            public Shelf()
            {
                Products = new List();
            }
        }
    }
    
    
    
    //Cascade All Helper Class
    using FluentNHibernate.Conventions;
    using FluentNHibernate.Conventions.AcceptanceCriteria;
    using FluentNHibernate.Conventions.Inspections;
    using FluentNHibernate.Conventions.Instances;
    using System;
    using System.Collections.Generic;
    
    
    namespace App4
    {
        public class CascadeAll : 
            IHasOneConvention, //Actually Apply the convention
            IHasManyConvention, 
            IReferenceConvention, 
            IHasManyToManyConvention,
    
            IHasOneConventionAcceptance, //Test to see if we should use the convention
            IHasManyConventionAcceptance, //I think we could skip these since it will always be true
            IReferenceConventionAcceptance, //adding them for reference later
            IHasManyToManyConventionAcceptance
        {
    
            //One to One
    
            public void Accept(IAcceptanceCriteria criteria)
            {
                //criteria.Expect(x => (true));
            }
    
            public void Apply(IOneToOneInstance instance)
            {
                instance.Cascade.All();
            }
    
    
    
    
            //One to Many
    
            public void Accept(IAcceptanceCriteria criteria)
            {
                //criteria.Expect(x => (true));
            }
    
            public void Apply(IOneToManyCollectionInstance instance)
            {
                instance.Cascade.All();
            }
    
    
    
    
            //Many to One
    
            public void Accept(IAcceptanceCriteria criteria)
            {
               // criteria.Expect(x => (true));
            }
    
            public void Apply(IManyToOneInstance instance)
            {
                instance.Cascade.All();
            }
    
    
    
    
    
            //Many to Many
    
            public void Accept(IAcceptanceCriteria criteria)
            {
               // criteria.Expect(x => (true));
            }
    
            public void Apply(IManyToManyCollectionInstance instance)
            {
                instance.Cascade.All();
            }
    
    
    
        }
    
    
    }
    

提交回复
热议问题