C# 流畅的NHibernate自动映射,应该可以节省时间,但这让我毛骨悚然

C# 流畅的NHibernate自动映射,应该可以节省时间,但这让我毛骨悚然,c#,nhibernate,orm,fluent-nhibernate,C#,Nhibernate,Orm,Fluent Nhibernate,我对NHibernate和FNH也是新手。我对ORM很熟悉,我决定看看这个特别的ORM有什么好消息,主要是因为它提高了生产率。在这一点上,我认为我的时间应该花在其他事情上,但我不想让它打败我,我希望这是我犯的一个愚蠢的错误,因为我非常想让它给我留下深刻印象。无论如何,我试图手动映射实体,但没有效果,现在我正在尝试使用自动映射功能。这是我的域模型 public class Book { public virtual int Id { get; protected set; } public v

我对NHibernate和FNH也是新手。我对ORM很熟悉,我决定看看这个特别的ORM有什么好消息,主要是因为它提高了生产率。在这一点上,我认为我的时间应该花在其他事情上,但我不想让它打败我,我希望这是我犯的一个愚蠢的错误,因为我非常想让它给我留下深刻印象。无论如何,我试图手动映射实体,但没有效果,现在我正在尝试使用自动映射功能。这是我的域模型

public class Book
{
 public virtual int Id { get; protected set; }
 public virtual string Isbn { get; set; }
 public virtual string Title { get; set; }
 public virtual string Author { get; set; }
 public virtual string Publisher { get; set; }
 public virtual User Seller { get; set; }
 public virtual ICollection<string> Pics {get; private set;}
 public virtual string Condition { get; set; }
 public virtual decimal Price { get; set; }
 public virtual ExchangeMethod PreferedExchangeMethod { get; set; }
}
public class Course
{
 public virtual int Id { get; protected set; }
 public virtual University University { get; set; }
 public virtual Semester Semester { get; set; }
 public virtual string Description { get; set; }
 public virtual string Name { get; set; }
 public virtual ICollection<Book> RequiredBooks { get; private set; }
}
public class Exchange
{
 public virtual int Id { get; protected set; }
 public virtual User Buyer { get; set; }
        public virtual User Seller { get; set; }
        public virtual Book Book { get; set; }
        public virtual ExchangeMethod Method { get; set; }
        public virtual decimal Price { get; set; }
        public virtual int SellerFeedbackRating { get; set; }
        public virtual int BuyerFeedbackRating{get; set;}
        public virtual string SellerComment { get; set; }
        public virtual string BuyerComment { get; set; }
}
public class Semester
{
        public virtual int id { get; protected set; }
        public virtual University University { get; set; }
        public virtual int Year { get; set; }
        public virtual string Term { get; set; }
}
public class University
{
        public virtual string Name { get; set; }
        public virtual int Connections { get; set; }
        public virtual ICollection<Course> Courses { get; private set; }
}
public class User
{
        public virtual string UserName { get; set; }
        public virtual string FirstName { get; set; }
        public virtual string LastName { get; set; }
        public virtual string Email { get; set; }
        public virtual ICollection<Course> Enrollment { get; private set; }
        public virtual ICollection<Book> Library { get; private set; }
        public virtual ICollection<Exchange> Exchanges { get; private set; }
}
这是我的地图

public static ISessionFactory CreateSessionFactory()
{
 IPersistenceConfigurer persistenceConfigurer = SQLiteConfiguration.Standard.UsingFile(DbFile);
        return Fluently.Configure()
                .Database(persistenceConfigurer)
                .Mappings(m => m.AutoMappings.Add(
                    AutoMap.AssemblyOf<User>(assem => assem.Namespace == "DataTransferObjects")
                        .Override<User>(map => map.Id(user => user.UserName))
                        .Override<University>(map => map.Id(univ => univ.Name))
                    ))
                .ExposeConfiguration(BuildSchema)
                .BuildSessionFactory();
}
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);
}
这是我一直得到的一个非常模糊的错误: XML验证错误:命名空间“urn:nhibernate-mapping-2.2”中的元素“class”在命名空间“urn:nhibernate-mapping-2.2”中具有无效的子元素“property”。命名空间“urn:nhibernate-mapping-2.2”中需要的可能元素列表:“meta、subselect、cache、synchronize、comment、tuplizer、id、composite id”

谢谢你的帮助,很抱歉发了这么长的帖子

编辑
我的模型布局方式是否会让我在循环逻辑(例如,用户有一本书,而该书有一个用户)方面容易出错?我希望自动映射能够检测到这一点。

您使用的是FNH和NHibernate 2.1 RTM的最新版本吗

我不太确定你对身份证代码的覆盖。您是否尝试过不使用此功能,并且在每个表中都有一个Id

下面是我如何使用Automap进行映射的。我告诉它从哪个程序集中提取,特别是哪个名称空间,然后给它我的实体派生自的基类型。 我使用ConventionDiscovery来更改一些外键命名约定,并设置级联和反向属性等

自动映射对我来说非常有效——尽管它确实需要时间来学习和实验。
我正在使用jet数据库,我必须显式地创建数据库文件,以便NHibernate在其上运行模式。我不熟悉sqlLite的工作原理。

您使用的是FNH和NHibernate 2.1 RTM的最新版本吗

我不太确定你对身份证代码的覆盖。您是否尝试过不使用此功能,并且在每个表中都有一个Id

下面是我如何使用Automap进行映射的。我告诉它从哪个程序集中提取,特别是哪个名称空间,然后给它我的实体派生自的基类型。 我使用ConventionDiscovery来更改一些外键命名约定,并设置级联和反向属性等

自动映射对我来说非常有效——尽管它确实需要时间来学习和实验。
我正在使用jet数据库,我必须显式地创建数据库文件,以便NHibernate在其上运行模式。我不熟悉sqlLite的工作原理。

好吧,因为我认为这是一个愚蠢的错误。对于学期实体,我使用id而不是id。有点否认FNH在进行自动映射时是区分大小写的,我会认为,如果有强大的键入支持,他们必须防止配置文件中的键入错误,那么情况就不同了


仅供参考,在进行自动映射时,默认情况下会尝试映射到每个实体上名为Id的属性,除非您指定其他属性。

好吧,因为我认为这是一个愚蠢的错误。对于学期实体,我使用id而不是id。有点否认FNH在进行自动映射时是区分大小写的,我会认为,如果有强大的键入支持,他们必须防止配置文件中的键入错误,那么情况就不同了


仅供参考,在进行自动映射时,默认情况下会尝试映射到每个实体上名为Id的属性,除非您指定其他方式。

谢谢您的回复。我不确定确切的版本,但我昨天直接从SVN回购协议中下载了它,所以它是最新的版本。我认为您在示例中使用的许多方法现在已经过时了。我不想使用整数ID,但如果使用一个我希望唯一的字符串对我来说更有意义,我会尝试一下,这可能有助于缩小我的范围。我按照您的建议添加了一个expicit ID属性,但仍然会遇到相同的错误。我肯定错过了一些简单的东西。谢谢你的回复。我不确定确切的版本,但我昨天直接从SVN回购协议中下载了它,所以它是最新的版本。我认为您在示例中使用的许多方法现在已经过时了。我不想使用整数ID,但如果使用一个我希望唯一的字符串对我来说更有意义,我会尝试一下,这可能有助于缩小我的范围。我按照您的建议添加了一个expicit ID属性,但仍然会遇到相同的错误。我已经错过了一些简单的东西。你的书/用户关系应该没有问题-他们应该正确地自动映射。您已经能够查看xml文件了吗?您的图书/用户关系应该没有问题-它们应该自动正确映射。您已经能够查看xml文件了吗
PersistenceModel = AutoPersistenceModel
        .MapEntitiesFromAssemblyOf<>()
        .Where(type => type.Namespace != null && type.Namespace.Contains("Model"))
        .WithSetup(s =>
                     {
                       s.IsBaseType = type => type ==  typeof (DateTimeBase)
                                              || type == typeof (SimpleBase);
                     })
        .ConventionDiscovery.AddFromAssemblyOf();
.Mappings(m => m.AutoMappings
                         .Add(persistenceModel)
                         .ExportTo(@"../../ExportAutoMaps"));