Ich habe folgenden Aufzählungstyp:Warum ignoriert AutoMapping von Fluents NHibernate einen Aufzählungstyp?
public enum EnumType
{
E1,
E2
}
in der folgenden Klasse verwendet:
public class X
{
public virtual int? Id { get; set; }
public virtual EnumType EnumProperty { get; set; }
public virtual string S { get; set; }
}
Ich mag mit NHibernate in einer Datenbankinstanz dieser Art bestehen bleiben. Und vorformulierten Schreiben von Code zu vermeiden, ich versuche Auto-Mapping-Funktion wie folgt zu verwenden:
private ISessionFactory CreateSessionFactory()
{
var mappings = AutoMap
.AssemblyOf<Domain.X>(new MyAutoMappingConfiguration());
this.NHibernateConfiguration = Fluently
.Configure()
.Database(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2012.ConnectionString(
b => b.FromConnectionStringWithKey("x")))
.Mappings(m => m.AutoMappings.Add(mappings))
.BuildConfiguration();
return this.NHibernateConfiguration.BuildSessionFactory();
}
wo MyAutoMappingConfiguration
wie folgt aussieht:
public class MyAutoMappingConfiguration: FluentNHibernate.Automapping.DefaultAutomappingConfiguration
{
public override bool ShouldMap(Type type)
{
return type.Namespace == "Domain";
}
public override bool IsComponent(Type type)
{
return type.Name == "EnumType";
}
}
Wenn ich das aus dieser Konfiguration generierte Schema zum Erstellen die Datenbank:
new SchemaExport(this.sessionProvider.NHibernateConfiguration)
.Execute(true, true, false);
das folgende Skript wird generiert und ausgeführt:
if exists (select * from dbo.sysobjects where id = object_id(N'[X]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [X]
create table [X] (
Id INT not null,
S NVARCHAR(255) null,
primary key (Id)
)
Warum wird die Eigenschaft EnumProperty
ignoriert?
Wenn ich füge eine explizite Abbildung für X
, oder (was scheint gleichwertig) eine Überschreibung für Auto-Mapping wie folgt aus:
var mappings = AutoMap
.AssemblyOf<Domain.X>(new MyAutoMappingConfiguration())
.Override<Domain.X>(m =>
{
m.Table("X");
m.Id(x => x.Id);
m.Map(x => x.EnumProperty); // this works
m.Map(x => x.S);
});
das Skript korrekt generiert wird:
if exists (select * from dbo.sysobjects where id = object_id(N'[X]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [X]
create table [X] (
Id INT not null,
EnumProperty NVARCHAR(255) null,
S NVARCHAR(255) null,
primary key (Id)
)
Dies zeigt, dass es scheint nichts falsch mit NHibernate die Fähigkeit zu sein, die präsentiert enum korrekt abzubilden. Warum kann Auto-Mapping damit nicht umgehen?
Wenn ich die folgende Methode MyAutoMappingConfiguration
hinzufügen:
public override bool ShouldMap(Member member)
{
var result = base.ShouldMap(member);
return result;
}
und legen Sie den Haltepunkt ist die result
true
für das EnumProperty
Mitglied, die irgendwie später ignoriert wird.
Aus bestimmten Gründen scheint es standardmäßig deaktiviert zu sein, wenn Auto-Mapping verwendet wird. https://groups.google.com/forum/#!topic/fluent-nhibernate/NJo0FiWXEwY – Najera
@Najera Bitte beachten Sie meinen Kommentar unter] DeJaVo's Antwort] (http://Stackoverflow.com/a/34714996/2642204). – BartoszKP
Wenn die Methode ausgeführt wird, ist leer, aber der Delegat wird ausgeführt? Wenn ja, wird Ihre Immobilie bewertet? – Najera