使用流畅的NHibernate AutoMapping保存级联 - 旧答案仍然有效吗?

Gle*_*enn 8 c# fluent-nhibernate

我想要完全解决这个问题: Cascade使用流畅的NHibernate AutoMapping保存

使用Fluent Nhibernate映射使用一次调用为所有类和关系类型全局打开"级联",而不是单独为每个映射设置它.

对早期问题的回答看起来很棒,但我担心Fluent Nhibernate API去年改变了它的.WithConvention语法并且打破了答案......或者我错过了什么.

我不断收到一堆名称空间未找到与IOneToOnePart,IManyToOnePart及其所有变体有关的错误:

"无法找到类型或命名空间名称'IOneToOnePart'(您是否缺少using指令或程序集引用?)"

我已经尝试了官方示例dll,RTM dll和最新版本,但它们似乎都没有让VS 2008看到所需的命名空间.

第二个问题是我想在我的AutoPersistenceModel中使用该类,但我不知道这一行在哪里:.ConventionDiscovery.AddFromAssemblyOf()在我的工厂创建方法中.

 private static ISessionFactory CreateSessionFactory()
            {

                return Fluently.Configure()
                  .Database(SQLiteConfiguration.Standard.UsingFile(DbFile))
                  .Mappings(m => m.AutoMappings
                        .Add(AutoMap.AssemblyOf<Shelf>(type => type.Namespace.EndsWith("Entities"))
                                .Override<Shelf>(map =>
                                {
                                    map.HasManyToMany(x => x.Products).Cascade.All();
                                })
                             )

                      )//emd mappings
                .ExposeConfiguration(BuildSchema)
                .BuildSessionFactory();//finalizes the whole thing to send back. 

            }
Run Code Online (Sandbox Code Playgroud)

下面是我正在尝试的类和使用语句

   using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;

    using FluentNHibernate.Conventions;
    using FluentNHibernate.Cfg;
    using FluentNHibernate.Cfg.Db;
    using NHibernate;
    using NHibernate.Cfg;
    using NHibernate.Tool.hbm2ddl;
    using FluentNHibernate.Mapping;


    namespace TestCode
    {
        public class CascadeAll : IHasOneConvention, IHasManyConvention, IReferenceConvention
        {
            public bool Accept(IOneToOnePart target)
            {
                return true;
            }

            public void Apply(IOneToOnePart target)
            {
                target.Cascade.All();
            }

            public bool Accept(IOneToManyPart target)
            {
                return true;
            }

            public void Apply(IOneToManyPart target)
            {
                target.Cascade.All();
            }

            public bool Accept(IManyToOnePart target)
            {
                return true;
            }

            public void Apply(IManyToOnePart target)
            {
                target.Cascade.All();
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

Tom*_*ell 18

我发现为整个项目执行此操作的最简单方法是使用DefaultCascade:

.Conventions.Add( DefaultCascade.All() );     
Run Code Online (Sandbox Code Playgroud)

转到维基上的"最简单的约定"部分,以及其他列表.

编辑: 以下是Wiki的列表:

Table.Is(x => x.EntityType.Name + "Table")
PrimaryKey.Name.Is(x => "ID")
AutoImport.Never()
DefaultAccess.Field()
DefaultCascade.All()
DefaultLazy.Always()
DynamicInsert.AlwaysTrue()
DynamicUpdate.AlwaysTrue()
OptimisticLock.Is(x => x.Dirty())
Cache.Is(x => x.AsReadOnly())
ForeignKey.EndsWith("ID")
Run Code Online (Sandbox Code Playgroud)

一句警告 - Wiki中的一些方法名称可能是错误的.我用我可以验证的内容编辑了Wiki(即DefaultCascade和DefaultLazy),但不能保证其余的.但是,如果需要,您应该能够使用Intellisense找出正确的名称.