我想做的正是这个问题所要求的: 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/