C# Fluent NHibernate与自动映射的关系问题
我制作了一个简单的示例应用程序来测试带有自动映射功能的Fluent NHibernate,但在保存时出现了一个异常 我的示例如下所示:C# Fluent NHibernate与自动映射的关系问题,c#,fluent-nhibernate,C#,Fluent Nhibernate,我制作了一个简单的示例应用程序来测试带有自动映射功能的Fluent NHibernate,但在保存时出现了一个异常 我的示例如下所示: public class Item { public virtual int Id { get; protected set; } public virtual string Name { get; set; } public virtual IList<Detail> Details { get; set; } p
public class Item {
public virtual int Id { get; protected set; }
public virtual string Name { get; set; }
public virtual IList<Detail> Details { get; set; }
public Item() {
Details = new List<Detail>();
}
}
public class Detail {
public virtual int Id { get; protected set; }
public virtual int ItemId { get; set; }
public virtual string Name { get; set; }
}
class Program {
static void Main(string[] args) {
var sessionFactory = CreateSessionFactory();
using (var session = sessionFactory.OpenSession()) {
using (var transaction = session.BeginTransaction()) {
Console.WriteLine("Enter name for new item: ");
var itemName = Console.ReadLine();
var page = new Item { Name = itemName };
Console.WriteLine("Enter name of new detail");
var detailName = Console.ReadLine();
var detail = new Detail {Name = detailName };
page.Details.Add(detail);
session.SaveOrUpdate(page);
transaction.Commit();
}
using (session.BeginTransaction()) {
}
Console.ReadKey();
}
}
private static ISessionFactory CreateSessionFactory() {
var model = AutoMap.AssemblyOf<Program>();
var sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(connection)
.Cache(c => c.UseQueryCache()
.ProviderClass<HashtableCacheProvider>())
.ShowSql())
.Mappings(m => m.AutoMappings.Add(model))
.BuildSessionFactory();
return sessionFactory;
}
}
公共类项目{
公共虚拟整数Id{get;protected set;}
公共虚拟字符串名称{get;set;}
公共虚拟IList详细信息{get;set;}
公共项目(){
详细信息=新列表();
}
}
公共类详细信息{
公共虚拟整数Id{get;protected set;}
公共虚拟int ItemId{get;set;}
公共虚拟字符串名称{get;set;}
}
班级计划{
静态void Main(字符串[]参数){
var sessionFactory=CreateSessionFactory();
使用(var session=sessionFactory.OpenSession()){
使用(var transaction=session.BeginTransaction()){
Console.WriteLine(“输入新项目的名称:”);
var itemName=Console.ReadLine();
var page=新项{Name=itemName};
Console.WriteLine(“输入新细节的名称”);
var detailName=Console.ReadLine();
var detail=new detail{Name=detailName};
第页。详细信息。添加(详细信息);
会话。保存或更新(第页);
Commit();
}
使用(session.BeginTransaction()){
}
Console.ReadKey();
}
}
私有静态ISessionFactory CreateSessionFactory(){
var model=AutoMap.AssemblyOf();
var sessionFactory=fluntly.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(连接)
.Cache(c=>c.UseQueryCache()
.ProviderClass())
.ShowSql())
.Mappings(m=>m.AutoMappings.Add(模型))
.BuildSessionFactory();
返回工厂;
}
}
当transaction.Commit()正在运行且对象引用未保存的临时实例时,此代码引发异常-在刷新之前保存临时实例
有谁能帮我找出问题所在吗?您的
详细信息
实例是“暂时的”,这意味着它尚未添加到您的NHibernate会话中
您有两种选择,其中#2可能是您的首选:
1) 会话。刷新会话前保存(详细信息)
2) 配置要级联的详细信息集合
当您使用自动映射功能时,有许多方法可以配置级联-我通常更喜欢使用[Cascade]
属性“污染”我的域模型,然后创建一个简单的IHasManyConvention
和IReferenceConvention
实现,检查属性的存在并相应地设置级联选项。我可以在FluentNHibernate程序集中找到级联属性吗?我应该用这个属性装饰我的类och属性吗?如果不太麻烦的话,你能给我举个例子就好了。谢谢你知道吗,我刚刚写了一篇关于这个东西的帖子:-事实上,我不知道FNH中有一个CascadeAttribute
,我说的是我自己的。我不知道FNH中的那个是做什么的。对不起,没有看到问号:)好吧,正如你现在可能知道的:FNH中没有对级联存储的本地支持,这听起来有点奇怪,无论如何,我已经在我的项目中包含了CascadeConvention代码,甚至没有在我的配置中使用它,我得到了这个错误:名称空间“urn:nhibernate-mapping-2.2”中的元素“class”的内容不完整。命名空间“urn:nhibernate-mapping-2.2”中需要的可能元素列表:“meta、subselect、cache、synchronize、comment、tuplizer、id、composite id”。此错误仅出现在我的项目中的类中。此错误可能来自将拾取作为实体的约定。确保您的自动映射配置为仅映射实体类-例如,仅在一个特定命名空间中包含类:new AutoPersistenceModel().AddEntityAssembly(typeof(Base).Assembly.Where(type=>type.namespace!=null&&type.namespace.Contains(“实体”)