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

我想要完全解决这个问题: 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(type => type.Namespace.EndsWith("Entities")) .Override(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() ); 

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

编辑:以下是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") 

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

这是一个完整的工作示例,类似于入门指南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(); } } } 

公约的签名已经改变。 你没有使用像ReSharper这样的东西吗? 这会指出你的结论。

您可以在Wiki上阅读有关新约定的更多信息。