S#arp アーキテクチャの一部として FluentNhibernate をいじっています。以下はマッピングの例です。
public class EventBaseMap : ClassMap<EventBase>
{
public EventBaseMap()
{
WithTable("Event_Header");
//NotLazyLoaded();
Id(x => x.Id).WithUnsavedValue(-1).GeneratedBy.Native();
Map(x => x.Name).WithLengthOf(50).Not.Nullable();
Map(x => x.Description).WithLengthOf(255);
Map(x => x.Rating);
Map(x => x.Price);
Map(x => x.PhoneNumber).WithLengthOf(20).Not.Nullable();
Map(x => x.EmailAddress);
Map(x => x.Website);
Map(x => x.State).Not.Nullable().CustomSqlTypeIs("INT");
Component(x => x.Ages, m =>
{
m.Map(x => x.From).TheColumnNameIs("AgeFrom");
m.Map(x => x.To).TheColumnNameIs("AgeTo");
});
HasMany(x => x.Calendar).AsBag();
HasManyToMany(x => x.Tags)
.WithTableName("Event_Tags")
.WithParentKeyColumn("EventId")
.WithChildKeyColumn("TagId").AsBag();
}
}
次に、Nhibernate スキーマ生成を使用して、ddl をファイルに出力します。
FileInfo t = new FileInfo(Server.MapPath("~/bin/MyDDL.sql"));
StreamWriter writer = t.CreateText();
new SchemaExport(cfg).Execute(true, false, false, true, NHibernateSession.Current.Connection, writer);
ここまでは順調ですね。ただし、このテーブルに対して生成された ddl は一致せず、実際にはエラーが含まれています。
create table Event_Header (
Id INT IDENTITY NOT NULL,
EmailAddress NVARCHAR(255) null,
PhoneNumber NVARCHAR(255) null,
State string null,
Website NVARCHAR(255) null,
Description NVARCHAR(255) null,
Name NVARCHAR(255) null,
Price DECIMAL(19,5) null,
Rating INT null,
AgeTo INT null,
AgeFrom INT null,
primary key (Id)
)
- Enum State は、強制的に INT を使用しようとしたにもかかわらず、文字列として表されます
- 電話番号の長さがマッピングと一致しません。
これをどのようにデバッグするのだろうと思っていました。これは FluentNH のマッピングの問題ですか、それともスキーマ ジェネレーターの問題ですか。生成されたxmlを出力できれば、検証できます。誰もこれを行う方法を知っていますか?
ありがとう、