我是第一次使用Fluent NHibernate和NHibernate的新手。我从2000年开始使用自定义书写的映射器。大约2年前转向LinqToSQL,大约6个月前转向实体。
我想看看Fluent / NHibernate提供什么。但是,我似乎无法让它正确运行。以下是我的类,它们的引用,ClassMaps的副本。有人能告诉我这个简单的实现是否正确吗?
这是我的映射和对象类:
using System;
using FluentNHibernate.Mapping;
namespace MyData.Data.Mappings
{
public class Login
{
public virtual int LoginId { get; private set; }
public virtual string Username { get; set; }
public virtual User User { get; set; }
}
public class LoginClassMap : ClassMap<Login>
{
public LoginClassMap()
{
Table("Logins");
Id(d => d.LoginId).GeneratedBy.Guid();
Map(d => d.Username).Not.Nullable().Length(50);
HasOne(d => d.User).ForeignKey("UserId").Cascade.All();
}
}
public class User
{
public virtual Guid UserId{ get; private set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual Login Login { get; set; }
}
public class UserClassMap : ClassMap<User>
{
public UserClassMap()
{
Table("Users");
Id(d => d.UserId).GeneratedBy.Guid();
Map(d => d.FirstName).Not.Nullable().Length(100);
Map(d => d.LastName).Not.Nullable().Length(100);
References(r => r.Login, "UserId").Not.Nullable();
}
}
}
这是我的存储库:
using System;
using System.Linq;
using NHibernate;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate.Linq;
using MyData.Data.Mappings;
namespace MyData.Data.Repository
{
public class LoginRepository
{
private readonly ISessionFactory _sessionFactory;
ISession _session;
public LoginRepository()
{
_sessionFactory = this.CreateSessionFactory();
_session = _sessionFactory.OpenSession();
}
private ISessionFactory CreateSessionFactory()
{
string connString = "MyDataConnectionString";
FluentConfiguration config = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2005.ConnectionString(
x => x.FromConnectionStringWithKey(connString)))
.ExposeConfiguration(
c => c.SetProperty("current_session_context_class", "webContext"))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Login>());
return config.BuildSessionFactory();
}
public IQueryable<Login> GetAllLogins()
{
return _session.Linq<Login>();
}
}
}
每当它到达config.BuildSessionFactory()时,它都会抛出以下错误:
创建SessionFactory时使用了无效或不完整的配置。
内部异常是:
调用目标抛出了异常。
这是接近这个的正确方法吗?任何想法或调整将不胜感激!
答案 0 :(得分:1)
Sean,你不能在LoginId上使用GeneratedBy.Guid(),因为它是一个int。尝试使用其他生成器或更改LoginId的类型。
我怀疑你不能在UserId上使用“私人集”,因为它是Id。
此外,HasOne(d =&gt; d.User).ForeignKey(“UserId”)表示如果从映射中公开数据库模型,则FK约束的名称将为“UserId”。在我看来,你的目的是指定在表“Users”上保存PK的名称列。
这些链接有更多信息:
http://wiki.fluentnhibernate.org/Fluent_mapping
http://jagregory.com/writings/i-think-you-mean-a-many-to-one-sir/
答案 1 :(得分:0)
好像你忘了指定代理工厂了。可以这样做:
OracleDataClientConfiguration persistenceConfigurer = OracleDataClientConfiguration
.Oracle10
.ConnectionString(connectionStringBuilder => connectionStringBuilder.FromAppSetting("Main.ConnectionString"))
.ProxyFactoryFactory<ProxyFactoryFactory>()
.CurrentSessionContext<ThreadStaticSessionContext>()
.AdoNetBatchSize(25)
.DoNot.ShowSql();
FluentConfiguration cfg = Fluently.Configure()
.Database(persistenceConfigurer)
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMap>());
return cfg.BuildConfiguration();