c# - 使用 Fluent NHibernate AutoMapping 进行级联保存 - 旧答案仍然有效吗?

标签 c# fluent-nhibernate

我想做的正是这个问题所要求的: Cascade Saves with Fluent NHibernate AutoMapping

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

前面的问题的答案看起来不错,但我担心 Fluent Nhibernate API 去年改变了它的 .WithConvention 语法并破坏了答案……要么那样,要么我遗漏了一些东西。

我不断收到一堆与 IOneToOnePart、IManyToOnePart 及其所有变体相关的 namespace 未找到错误:

“找不到类型或命名空间名称‘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. 

            }

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

   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();
            }
        }

    }

最佳答案

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

.Conventions.Add( DefaultCascade.All() );     

转到 "The Simplest Conventions"维基上的部分,为此,以及其他列表。

编辑: 这是来自 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")

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

关于c# - 使用 Fluent NHibernate AutoMapping 进行级联保存 - 旧答案仍然有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2242902/

相关文章:

c# - 独立存储中的绑定(bind)图像

c# - 为什么从组合框进行选择后切换图形需要更长的时间?

C# 使用 lambda 表达式委托(delegate)逆变

c# - 如何在 Fluent NHibernate 中映射 IDictionary<string, Entity>

linq - NHibernate、NHibernate.Linq 和 FluentNHibernate? throw 错误

fluent-nhibernate - “NHibernate.Cfg.Configuration”的类型初始值设定项引发了异常

c# - 扩展列表框还是使用替代方案?

c# - 将 Combobox.SelectedItem 转换回 DateTime 会导致 "Specified cast is not valid."

asp.net-mvc - Fluent NHibernate 和存储库模式

c# - 使用 IDictionary<TKey,TValue> 映射与 FluentNHibernate 的三元关联