过去两个小时我一直在谷歌搜索和堆栈溢出,无法找到我的问题的答案:
我正在使用ASP.NET MVC和NHibernate,而我所要做的就是手动映射我的实体而不映射其基类。我使用以下约定:
public class Car : EntityBase
{
public virtual User User { get; set; }
public virtual string PlateNumber { get; set; }
public virtual string Make { get; set; }
public virtual string Model { get; set; }
public virtual int Year { get; set; }
public virtual string Color { get; set; }
public virtual string Insurer { get; set; }
public virtual string PolicyHolder { get; set; }
}
不应映射EntityBase。
我的NHibernate助手类看起来像这样:
namespace Models.Repository
{
public class NHibernateHelper
{
private static string connectionString;
private static ISessionFactory sessionFactory;
private static FluentConfiguration config;
/// <summary>
/// Gets a Session for NHibernate.
/// </summary>
/// <value>The session factory.</value>
private static ISessionFactory SessionFactory
{
get
{
if (sessionFactory == null)
{
// Get the connection string
connectionString = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;
// Build the configuration
config = Fluently.Configure().Database(PostgreSQLConfiguration.PostgreSQL82.ConnectionString(connectionString));
// Add the mappings
config.Mappings(AddMappings);
// Build the session factory
sessionFactory = config.BuildSessionFactory();
}
return sessionFactory;
}
}
/// <summary>
/// Add the mappings.
/// </summary>
/// <param name="mapConfig">The map config.</param>
private static void AddMappings(MappingConfiguration mapConfig)
{
// Load the assembly where the entities live
Assembly assembly = Assembly.Load("myProject");
mapConfig.FluentMappings.AddFromAssembly(assembly);
// Ignore base types
var autoMap = AutoMap.Assembly(assembly).IgnoreBase<EntityBase>().IgnoreBase<EntityBaseValidation>();
mapConfig.AutoMappings.Add(autoMap);
// Merge the mappings
mapConfig.MergeMappings();
}
/// <summary>
/// Opens a session creating a DB connection using the SessionFactory.
/// </summary>
/// <returns></returns>
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
/// <summary>
/// Closes the NHibernate session.
/// </summary>
public static void CloseSession()
{
SessionFactory.Close();
}
}
}
我现在得到的错误是:
System.ArgumentException:类型或 方法有2个通用参数,但是 提供了1个通用参数。一个 必须提供通用参数 每个通用参数
当我尝试添加映射时会发生这种情况。有没有其他方法可以手动映射您的实体并告诉NHibernate不要映射基类?
答案 0 :(得分:7)
IncludeBase<T>
AutoMap.AssemblyOf<Entity>()
.IgnoreBase<Entity>()
.Where(t => t.Namespace == "Entities");
答案 1 :(得分:3)
如果您不想自动化课程,我建议您使用IAutoMappingOverride<T>
。我不关心你的数据库,但它可能看起来像:
public class CarOverride : IAutoMappingOverride<Car>
{
public void Override(AutoMapping<Car> mapping){
mapping.Id( x => x.Id, "CarId")
.UnsavedValue(0)
.GeneratedBy.Identity();
mapping.References(x => x.User, "UserId").Not.Nullable();
mapping.Map(x => x.PlateNumber, "PlateNumber");
// other properties
}
}
假设您将这些地图集中放置,您可以将它们加载到您的autoMap:
var autoMap = AutoMap.Assembly(assembly).IgnoreBase<EntityBase>().IgnoreBase<EntityBaseValidation>()
.UseOverridesFromAssemblyOf<CarOverride>();
答案 2 :(得分:1)
我知道这是一个老问题,但我认为这里缺少一些东西:
当您使用IgnoreBase<T>
时,您告诉您不希望将继承映射到您的数据库,但Fluent Nhibernate
仍然会将您的基类映射为单个类,而您不会告诉它不要这样做,所以如果你想告诉Fluent Nhibnernate
不要映射类本身,你应该继承DefaultAutoMapConfiguration
类并覆盖它的bool ShouldMap(Type type)
并返回false如果类型是任何您根本不想要映射的类型。
当您使用AutoMapping
时,您通常不需要任何其他映射类或覆盖,除非您想对映射进行更改,并且无法使用{{1}进行更改或者你只是想覆盖一个类的一小部分。(尽管你可以使用Conventions
和Conventions
来做同样的事情)
答案 3 :(得分:0)
您可以将IsBaseType约定用于自动化