Fluent nhibernate 自动映射不会';我没有一个Id映射
我在自动映射方面的经验是,只要实体类具有以下行:Fluent nhibernate 自动映射不会';我没有一个Id映射,fluent-nhibernate,automapping,Fluent Nhibernate,Automapping,我在自动映射方面的经验是,只要实体类具有以下行: Initialization method TestProject1.MappingTestBase.TestInitialize threw exception. FluentNHibernate.Cfg.FluentConfigurationException: FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration
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)..
自动映射器会将其视为一个ID,程序员不会提供进一步的帮助(即,不需要在自动映射调用中使用FindIdenity代码)
我在您的ID声明中看到的唯一区别是,您使用的类型是long而不是int。不知道这是否重要。一般来说,使用
自动映射是一个糟糕的策略,因为您的数据库表中必须存在已存档的ID
。相反,考虑使用FLUENT映射生成器,例如处理映射。
在这种情况下,您首先需要下载/安装应用程序,然后从数据库(Oracle、SQL和其他各种数据库)生成映射文件
为了创建映射文件,首先在项目中创建一个/Entities/
文件夹。接下来,按如下方式配置发电机软件:
首选项
生成的属性名称=与数据库列名相同(无更改)
映射样式=流畅映射
字段或属性=自动属性
可用语言:C#和VB
文件夹:[您的项目文件夹]\Entities
命名空间:[您的项目命名空间].实体
程序集名称:[您的项目名称]。实体
接下来,要么生成全部,要么生成特定的表
现在应该在项目中创建所有*.cs
和*Map.cs
文件(如果它们没有显示,可以使用添加现有项…
添加它们)
使用Fluent,您将看到如下内容:
public virtual int Id { get; private set; }
或
或
因此,现在我们需要使用FluentMapping
和fluentnhibernate
指定Id
。为此,您需要覆盖解决方案中每个Map
文件中的Id
行。只需添加:
Id(x => x.keyName_ID)
.Column(x => x.keyname_ID)
.GeneratedBy
.Assigned()
其中keyname\u id
是数据库中id
的列名,而不是创建的列名
请注意,在BuildSession
的映射中,必须具有:
Id(x => x.KeyName_ID)
.GeneratedBy
.GetGeneratorMapping()
.IsSpecified("KeyName_ID");
(…).Mappings(m=>
m、 FluentMappings.AddFromAssemblyOf()的
);
现在,Id
已映射。:)我希望这有帮助 以上两个答案都是正确的;除非您以不同的方式指定,否则自动映射程序假定您有一个int-Id字段。
如果您的Id很长,自动映射器可能无法正确识别它。
尝试为类定义MappingOverride,如下所示:
(...).Mappings(m =>
m.FluentMappings.AddFromAssemblyOf<[one of your entities]>()
);
public类UserMappingOverride:IAutoMappingOverride
{
#区域IAutoMappingOverride成员
公共无效替代(自动映射)
{
Id(u=>u.Name);
}
#端区
}
Id()函数允许您覆盖automapper关于Id字段应该是什么的约定。
有关覆盖的更多信息,请参阅。
干杯,
约翰尼Thx汤姆。Am使用Oracle 10g,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(x => x.KeyName_ID)
.GeneratedBy
.GetGeneratorMapping()
.IsSpecified("KeyName_ID");
(...).Mappings(m =>
m.FluentMappings.AddFromAssemblyOf<[one of your entities]>()
);
public class UserMappingOverride : IAutoMappingOverride<User>
{
#region IAutoMappingOverride<User> Members
public void Override(AutoMapping<User> mapping)
{
mapping.Id(u => u.Name);
}
#endregion
}