gpt4 book ai didi

c# - Fluent NHibernate AutoMapping,应该可以节省时间,但这让我很抓狂

转载 作者:太空宇宙 更新时间:2023-11-03 19:36:17 25 4
gpt4 key购买 nike

我也是 NHibernate 和 FNH 的新手。我熟悉 ORM,并决定看看所有关于这个特定 ORM 的讨论主要是因为生产力的提高。在这一点上,我认为我的时间最好花在其他东西上,但我不想让它打败我,我希望这是我犯的一个愚蠢的错误,因为我非常希望它能给我留下深刻印象。无论如何,我尝试手动映射实体(Fluent)无济于事,现在我正在尝试使用自动映射功能。这是我的域模型。

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”中的“元、子选择、缓存、同步、注释、tuplizer、id、复合 ID”

感谢您的帮助,抱歉发了这么长的帖子。

编辑我布置模型的方式是否让我容易出现循环逻辑错误,例如用户有一本书,这本书有一个用户?我希望自动映射能够拾取它。

最佳答案

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

我不太确定您对 ID 代码的覆盖。您是否尝试过不使用它并在每个表中都有一个 Id?

以下是我如何使用 Automap 进行映射。我告诉它从什么 Assembly 中提取,特别是什么命名空间,然后我给它我的实体派生自的 BaseTypes。我使用 ConventionDiscovery 更改一些外键命名约定并设置级联和反向属性等。

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();
然后我将持久性模型添加到自动映射中。我使用 ExportTo 方法获取生成的 xml 文件的副本 - 查看 xml 有助于诊断一些问题。

.Mappings(m => m.AutoMappings
.Add(persistenceModel)
.ExportTo(@"../../ExportAutoMaps"));

AutoMapping 对我来说效果很好——尽管它确实需要时间来学习和试验。
我正在使用 jet 数据库,我必须为 NHibernate 显式创建我的数据库文件以在其上运行模式。我不熟悉 sqlLite 的工作原理。

关于c# - Fluent NHibernate AutoMapping,应该可以节省时间,但这让我很抓狂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1418769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com