C# 如何让NHibernate返回复合键表上的数据?
我的数据库中有一个连接表。我需要读取id值并在程序中使用它们。我无法让NHibernate返回数据库中的任何记录。看起来好像我的映射文件“已编译”,但没有返回任何结果 链接表C# 如何让NHibernate返回复合键表上的数据?,c#,nhibernate,orm,hbm,C#,Nhibernate,Orm,Hbm,我的数据库中有一个连接表。我需要读取id值并在程序中使用它们。我无法让NHibernate返回数据库中的任何记录。看起来好像我的映射文件“已编译”,但没有返回任何结果 链接表 intid\u ObjectA(外键) intid\u ObjectB(外键) LinkDAO类: public class LinkDAO { public virtual ObjectADAO ObjectA { get; set; } public virtual ObjectBDAO Objec
- intid\u ObjectA(外键)
- intid\u ObjectB(外键)
public class LinkDAO
{
public virtual ObjectADAO ObjectA { get; set; }
public virtual ObjectBDAO ObjectB { get; set; }
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
var t = obj as LinkDAO;
if (t == null)
{
return false;
}
return (t.ObjectA == ObjectA && t.ObjectB == ObjectB);
}
public override int GetHashCode()
{
return (ObjectA.Name + "|" + ObjectB.Name).GetHashCode();
}
}
映射文件'LinkDAO.hbm.xml':
我这样问:
IList<LinkDAO> links =
NHibernateContext.Current().Session.QueryOver<LinkDAO>().List();
//Empty list is returned, but I can check the DB and see records
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3.Models
{
[Serializable]
public class ObjectADAO
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
[Serializable]
public class ObjectBDAO
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
}
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="ConsoleApplication3"
namespace="ConsoleApplication3.Models">
<class name="ObjectADAO">
<id name="Id" type="Int32" generator="native"/>
<property name="Name" />
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="ConsoleApplication3"
namespace="ConsoleApplication3.Models">
<class name="ObjectBDAO">
<id name="Id" type="Int32" generator="native"/>
<property name="Name" />
</class>
</hibernate-mapping>
IList链接=
NHibernateContext.Current().Session.QueryOver().List();
//返回空列表,但我可以检查数据库并查看记录
问题:
当表仅由复合键组成时,如何将这两列读取为int值?(有对实际对象的引用会很有用,但int-id就足够了)我将类LinkDAO设置为可序列化的 不确定您是否打算使用ObjectADAO和ObjectBDAO,并将其设置为:
IList<LinkDAO> links =
NHibernateContext.Current().Session.QueryOver<LinkDAO>().List();
//Empty list is returned, but I can check the DB and see records
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3.Models
{
[Serializable]
public class ObjectADAO
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
[Serializable]
public class ObjectBDAO
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
}
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="ConsoleApplication3"
namespace="ConsoleApplication3.Models">
<class name="ObjectADAO">
<id name="Id" type="Int32" generator="native"/>
<property name="Name" />
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="ConsoleApplication3"
namespace="ConsoleApplication3.Models">
<class name="ObjectBDAO">
<id name="Id" type="Int32" generator="native"/>
<property name="Name" />
</class>
</hibernate-mapping>
似乎ObjectA在类中声明了两次LinkDAO@dan_l抱歉,当我从代码示例中删除特定于业务的对象名称时,这似乎是一个输入错误。我已经更新了posthi James。你觉得我在下面给出的答案怎么样?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ConsoleApplication3.Models;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
var cfg = new Configuration();
cfg.Configure();
cfg.AddAssembly(typeof(LinkDAO).Assembly);
new SchemaExport(cfg).Execute(script: true, export: true, justDrop: true);
new SchemaExport(cfg).Execute(script:true, export:true, justDrop:false);
var objAs = new ObjectADAO[] { new ObjectADAO { Name = "A1" }, new ObjectADAO { Name = "A2" } };
var objBs = new ObjectBDAO[] { new ObjectBDAO { Name = "B1" }, new ObjectBDAO { Name = "B2" } };
using (var _sessionFactory = cfg.BuildSessionFactory())
{
using (var session = _sessionFactory.OpenSession())
{
using (var tran = session.BeginTransaction())
{
objAs.ToList().ForEach(x => session.Save(x));
objBs.ToList().ForEach(x => session.Save(x));
tran.Commit();
}
using (var tran = session.BeginTransaction())
{
session.Save(new LinkDAO { ObjectA = objAs[0], ObjectB = objBs[1] });
session.Save(new LinkDAO { ObjectA = objAs[1], ObjectB = objBs[0] });
tran.Commit();
}
IList<LinkDAO> links = session.QueryOver<LinkDAO>().List();
links.All(lk => { Console.WriteLine("{0} {1}", lk.ObjectA.Name, lk.ObjectB.Name); return true; });
var ids = session.QueryOver<LinkDAO>().Select(x => x.ObjectA.Id, x => x.ObjectB.Id ).List<object[]>();
ids.All(ary => { Console.WriteLine("{0} {1}", ary[0], ary[1]); return true; });
}
}
}
}
}
NHibernate: SELECT this_.id_ObjectA as id1_2_0_, this_.id_ObjectB as id2_2_0_ FROM LinkTable this_
A1 B2
A2 B1
NHibernate: SELECT this_.id_ObjectA as y0_, this_.id_ObjectB as y1_ FROM LinkTable this_
1 2
2 1