My Entity Class:
public class Building
{
/// <summary>
/// internal Id
/// </summary>
public virtual long Id { get; set; }
..............
}
我的映射:
var model = AutoMap.AssemblyOf<Building>()
.Setup(s => s.FindIdentity = p => p.Name == "Id")
.Where(t => t.Namespace == "SpikeAutoMappings");
var database = Fluently.Configure()
.Database(DatabaseConfigurer)
.Mappings(m=>m.AutoMappings.Add(model));
我需要有人帮我看看有什么问题,因为我在运行单元测试时一直有这个错误:
Initialization method TestProject1.MappingTestBase.TestInitialize threw exception. FluentNHibernate.Cfg.FluentConfigurationException: FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
---> FluentNHibernate.Visitors.ValidationException: The entity doesn't have an Id mapped. Use the Id method to map your identity property. For example: Id(x => x.Id)..
答案 0 :(得分:9)
以上两个答案都是正确的;除非您指定不同,否则automapper会假定您有一个int Id字段 如果您的Id很长,则自动播放器可能无法正确识别它 尝试为您的类定义MappingOverride,如下所示:
public class UserMappingOverride : IAutoMappingOverride<User>
{
#region IAutoMappingOverride<User> Members
public void Override(AutoMapping<User> mapping)
{
mapping.Id(u => u.Name);
}
#endregion
}
Id()函数允许您覆盖自动化程序对ID字段应该是什么的约定
有关覆盖的更多信息,请参阅http://wiki.fluentnhibernate.org/Auto_mapping#Overrides
干杯,
的Jhonny
答案 1 :(得分:1)
通常,使用AutoMapping
是一个糟糕的策略,因为归档Id
必须存在于数据库表中。相反,请考虑使用流畅的映射生成器(例如NMG)来处理映射。
在这种情况下,您首先要下载/安装应用程序,然后从数据库(Oracle,SQL和其他各种程序)生成映射文件。
要创建映射文件,请首先在项目中创建一个/Entities/
文件夹。接下来,按如下方式配置生成器软件:
偏好强>
可用语言:C#和VB
[your project folder]\Entities
[your project namespace].Entities
[your project name].Entities
接下来,“全部生成”或“生成特定表”。
现在应该在项目中创建所有*.cs
和*Map.cs
文件(如果它们没有显示,您可以使用Add Existing Item...
添加它们。)
使用Fluent,您将看到如下内容:
Id(x => x.keyName_ID)
.Column(x => x.keyname_ID)
.GeneratedBy
.Sequence("keyname_ID")
或
Id(x => x.keyName_ID)
.Column(x => x.keyname_ID)
.GeneratedBy
.Identity()
.Column("keyname_ID")
或
Id(x => x.keyName_ID)
.Column(x => x.keyname_ID)
.GeneratedBy
.Assigned()
因此,现在我们需要使用Id
FluentMapping
和Fluent nHibernate
来指定Id
。为此,您需要覆盖解决方案中每个Map
文件中的Id(x => x.KeyName_ID)
.GeneratedBy
.GetGeneratorMapping()
.IsSpecified("KeyName_ID");
代码行。只需添加:
keyname_id
其中id
是数据库中BuildSession
的列名,而不是创建的列名。
请注意,在(...).Mappings(m =>
m.FluentMappings.AddFromAssemblyOf<[one of your entities]>()
);
的映射中,您必须拥有:
Id
现在{{1}}被映射了。 :)我希望这有帮助!
答案 2 :(得分:0)
我对Automapping的体验是,只要您的Entity类具有以下行:
public virtual int Id { get; private set; }
自动化程序会将其视为ID而无需程序员的进一步帮助(即不需要在AutoMap调用中使用的FindIdenity代码)。
我在ID声明中看到的唯一区别是你使用的是long类型而不是int类型。不知道这是否重要。