如何使用NHibernate Mapping或Fluent NHibernate创建多列索引和/或唯一约束.
我已经阅读了很多关于同样错误的问题,但没有找到与我的确切问题相符的问题.我正在尝试使用Fluent NHibernate访问对象的属性,它本身是根对象的一部分.一些答案说我需要使用投影,其他我需要使用连接,我认为它应该通过延迟加载.
这是我的两个类以及Fluent映射:
艺术家班
public class Artist
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<Album> Albums { get; set; }
public virtual string MusicBrainzId { get; set; }
public virtual string TheAudioDbId { get; set; }
public Artist() { }
}
public class ArtistMap : ClassMap<Artist>
{
public ArtistMap()
{
LazyLoad();
Id(a => a.Id);
Map(a => a.Name).Index("Name");
HasMany(a => a.Albums)
.Cascade.All();
Map(a => a.MusicBrainzId);
Map(a => a.TheAudioDbId);
} …Run Code Online (Sandbox Code Playgroud) 如何在源代码大小为varbinary(max)的sql server 2005表中创建一个varbinary字段,以获得流畅的nhibernate?目前我总是得到varbinary(8000)的默认值,这不够大,因为我将存储图像文件.
我尝试过使用CAstle.ActiveRecord但尚未取得任何成功.
[ActiveRecord]
public class MyFile : Entity
{
public virtual string FileName { get; set; }
public virtual string FileType { get; set; }
public virtual int FileVersion { get; set; }
public virtual int FileLength { get; set; }
[Property(ColumnType = "BinaryBlob", SqlType = "VARBINARY(MAX)")]
public virtual byte[] FileData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
几个小时都未能找到解决方案,所以提前谢谢
捷克克朗
为简单起见.我在运行时使用Fluent NHibernate的Automapping和NHibernate的SchemaUpdate.在每次运行时,Automapper为所有实体类创建映射,SchemaUpdate将模式应用于现有数据库.我惊喜地发现它对空数据库也能正常工作.到目前为止,它在开发环境中运行良好,并且让我能够快速响应错误.
我的问题是它是否足够可靠留在生产代码中.显然,每次程序在生产环境中启动时都不需要运行,但它对增量产品更新很有用(尽管我不打算在产品发布后对域进行任何重大更改).
(也许我真正的问题应该是结合使用这两个工具有多安全?)
更新
该应用程序有两个版本:独立桌面和多用户客户端/服务器.此外,由于业务领域(税务软件)的性质,我每年都有一个干净的数据库.
我编写了一个NHibernateSessionFactory类,它包含一个静态的Nhibernate ISessionFactory.这用于确保我们只有一个会话工厂,并且第一次调用OpenSession()我创建了一个实际的SessionFactory - 下次我使用相同的并打开一个会话.代码如下所示:
public class NhibernateSessionFactory : INhibernateSessionFactory
{
private static ISessionFactory _sessionFactory;
public ISession OpenSession()
{
if (_sessionFactory == null)
{
var cfg = Fluently.Configure().
Database(SQLiteConfiguration.Standard.ShowSql().UsingFile("Foo.db")).
Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>());
_sessionFactory = cfg.BuildSessionFactory();
BuildSchema(cfg);
}
return _sessionFactory.OpenSession();
}
private static void BuildSchema(FluentConfiguration configuration)
{
var sessionSource = new SessionSource(configuration);
var session = sessionSource.CreateSession();
sessionSource.BuildSchema(session);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个问题.我的应用程序分为客户端和服务器.Nhibernate的东西在服务器端.在启动时,我的客户端和服务器都希望通过一些将使用NhibernateSessionFactory的服务来访问数据库.结果是在请求来自客户端之前是否创建了_sessionFactory的竞争条件.如果不是它会失败..
我想我需要在NhibernateSessionFactory中使用某种排队或等待机制,但我不知道该怎么做.以前有人遇到过同样的问题吗?什么是最好的解决方案?
我有一个根对象,其属性是一个集合.
例如:
I have a Shelf object that has Books.
// Now
public class Shelf
{
public ICollection<Book> Books {get; set;}
}
// Want
public class Shelf
{
public IQueryable<Book> Books {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我想要完成的是返回一个IQueryable的集合,这样我就可以直接从父节点运行分页和过滤集合.
var shelf = shelfRepository.Get(1);
var filtered = from book in shelf.Books
where book.Name == "The Great Gatsby"
select book;
Run Code Online (Sandbox Code Playgroud)
我希望NHibernate专门执行该查询,而不是全部加载整个集合,然后在内存中解析它(这是我使用ICollection时当前发生的事情).
这背后的原因是我的收藏可能是巨大的,成千上万的记录,并且获取所有查询可能会破坏我的数据库.
我想隐含地这样做,以便当NHibernate在我的课上看到IQueryable时它知道该怎么做.
我查看了NHibernate的LINQ提供程序,目前我正在决定采用大型集合并将它们拆分到自己的存储库中,以便我可以显式调用过滤和分页.
LINQ To SQL提供类似于我所说的内容.
我正在使用Fluent Nhibernate和Nhibernate来完成我当前的项目.我需要将时间记录到毫秒.我有这个用于我的映射
Map(x => x.SystemDateTime)
.CustomType("Timestamp")
.Not.Nullable();
Run Code Online (Sandbox Code Playgroud)
我创建了hbm.xml文件,该行如下:
<property name="SystemDateTime" type="Timestamp">
<column name="SystemDateTime" not-null="true" />
</property>
Run Code Online (Sandbox Code Playgroud)
我已经读过这是修复,但数据库中的记录没有毫秒.有谁解决了这个问题.我也尝试过CustomSqlType.
谢谢
准备一堵代码墙...这是一个很长的阅读,但它是我可以得到的冗长.
我想我开始越来越接近理解这一切了.我正在尝试习惯使用它.这是我到目前为止所拥有的.
Project.Web(ASP.NET MVC 3.0 RC)
Project.Models(域对象)
Membership.MemberMembership.IMembershipProviderProject.Persistence(流利的nHibernate)
使用Castle.Windsor
Membership.MembershipProvider : IMembershipProvider
我有以下课程 Project.Persistence
using Castle.Windsor;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
namespace Project.Persistence
{
public static class IoC
{
private static IWindsorContainer _container;
public static void Initialize()
{
_container = new WindsorContainer()
.Install(
new Persistence.Containers.Installers.RepositoryInstaller()
);
}
public static T Resolve<T>()
{
return _container.Resolve<T>();
}
}
}
namespace Persistence.Containers.Installers
{
public class RepositoryInstaller : IWindsorInstaller
{
public …Run Code Online (Sandbox Code Playgroud) 我看到当我从Nuget安装流畅的nhibernate 1.2时,它会下载nhibernate 3.1.如果我想使用nhibernate 3.2,我将如何通过nuget实现这一点并且它与流畅的nhibernate 1.2兼容?
我有两个类Order和Items
我想要一个像这样的方法
class Order
{
public virtual IList<Item> GetItems(Order order)
{
//get items for that order.
}
}
class Item
{
public virtual IList<Order> GetOrders(Item item)
{
//get all the orders in which that items is present.
}
}
Run Code Online (Sandbox Code Playgroud)
是编写创建这样的方法还是我应该创建一个属性
public virtual IList<Item> Items { get; set; }
Run Code Online (Sandbox Code Playgroud)
我应该怎么做这个映射是nhibernate?