我試圖使用流暢的自動映射功能爲以下模型和程序生成 DDL,但不知何故,我總是收到 錯誤「關聯引用未映射的類:IRole「,當我在NHibernate中調用 GenerateSchemaCreationScript方法時。當我用接口的實現(用戶 和角色)替換 ILists的類型時,一切正常。我在這裏做錯了什麼?我如何可以流利地使用在Unity中定義的 實現的IUser和IRole版本?當在模型中使用接口時出現錯誤「關聯引用未映射的類」
public interface IRole
{
string Title { get; set; }
IList<IUser> Users { get; set; }
}
public interface IUser
{
string Email { get; set; }
IList<IRole> Roles { get; set; }
}
public class Role : IRole
{
public virtual string Title { get; set; }
public virtual IList<IUser> Users { get; set; }
}
public class User : IUser
{
public virtual string Email { get; set; }
public virtual IList<IRole> Roles { get; set; }
}
我用下面的程序來生成NHibernate的使用 GenerateSchemaCreationScript的DDL:
class Program
{
static void Main(string[] args)
{
var ddl = new NHibernateSessionManager();
ddl.BuildConfiguration();
}
}
public class NHibernateSessionManager
{
private ISessionFactory _sessionFactory;
private static IUnityContainer _container;
private static void InitContainer()
{
_container = new UnityContainer();
_container.RegisterType(typeof(IUser), typeof(User));
_container.RegisterType(typeof(IRole), typeof(Role));
}
public ISessionFactory BuildConfiguration()
{
InitContainer();
return
Fluently.Configure().Database(MsSqlConfiguration.MsSql2008
.ConnectionString("ConnectionString"))
.Mappings(m => m.AutoMappings.Add(
AutoMap.AssemblyOf<IUser>()))
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
}
private void BuildSchema(Configuration cfg)
{
var ddl = cfg.GenerateSchemaCreationScript(new
NHibernate.Dialect.MsSql2008Dialect());
System.IO.File.WriteAllLines("Filename", ddl);
}
}
比較遺憾的是 - 它當然應該是: .Mappings(M = > m.AutoMappings.Add( AutoMap.AssemblyOf())) 但我的問題仍然是一樣的,我得到的錯誤: 公共虛擬IList 用戶{get;組; } 和 公共虛擬IList 角色{get;組; } 任何想法如何解決這個問題? –
Bjarke
2010-03-15 08:15:42
查看編輯到我原來的答案。 – 2010-03-15 12:08:55
根據http://steve-fair-dev.blogspot.com/2009/10/nhibernate-entity-property-is-interface.html有可能告訴NHibernate它應該爲接口使用哪種實現(使用映射 - 文件)。我只是想知道是否有辦法讓Fluent的automapping知道同樣的事情? – Bjarke 2010-03-16 10:14:00