したがって、データベースのほぼ全体を正常にマッピングできました (マッピングのすべてのテストに合格しました)。ただし、継承マッピングを実装しようとすると、テストに合格しません。
通常のエンティティは常に、ID を含むクラス「エンティティ」から継承します。
public class Project : Entity<int>
{
public virtual string Name { get; set; }
public virtual Client Client { get; set; }
public virtual Quotation Quotation { get; set; }
public virtual IList<HoursSpent> HoursSpent { get; set; }
public Project()
{
HoursSpent = new List<HoursSpent>();
}
public virtual void AddHoursSpent(HoursSpent HourSpent)
{
HourSpent.Project = this;
HoursSpent.Add(HourSpent);
}
}
次の状況をマッピングする必要があります (画像へのリンクを投稿できないため)。
TABLE [dbo].[project]
[project_id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](50) NOT NULL,
[client_id] [int] NOT NULL,
[quotation_id] [int] NULL,
PK => project_id
FK => client_id and quotation_id
TABLE [dbo].[quotation](
[quotation_id] [int] IDENTITY(1,1) NOT NULL,
[trainee_cost] [decimal](18, 0) NOT NULL,
[architect_cost] [decimal](18, 0) NOT NULL,
PK => quotation_id
TABLE [dbo].[quotation_per_hour](
[paperwork_expenses] [int] NOT NULL,
[insurance_tax] [decimal](18, 0) NOT NULL,
[hourly_operating_expenses] [decimal](18, 0) NOT NULL,
[quotation_id] [int] NOT NULL,
PK => quotation_id
FK => quotation_id
TABLE [dbo].[quotation_per_percentage](
[quotation_id] [int] NOT NULL,
[wage_percentage] [decimal](18, 0) NOT NULL,
PK => quotation_id
FK => quotation_id
したがって、quotation のサブクラスなしでマッピングを検証すると、テストはパスしました。ただし、サブクラスを実装するとエラーが発生します。
まずすべてのマッピング:
public class ProjectMap : ClassMap<Project>
{
public ProjectMap()
{
Table("project");
Id(x => x.Id)
.Column("project_id")
.GeneratedBy.Native();
Map(x => x.Name)
.Column("name");
References(x => x.Client)
.Column("client_id")
.Cascade.SaveUpdate();
References(x => x.Quotation)
.Column("quotation_id")
.Cascade.SaveUpdate();
HasMany(x => x.HoursSpent)
.Table("hours_spent")
.KeyColumn("project_id")
.Cascade.SaveUpdate()
.Inverse();
}
}
public class QuotationMap : ClassMap<Quotation>
{
public QuotationMap()
{
Table("quotation");
Id(x => x.Id)
.Column("quotation_id")
.GeneratedBy.Native();
Map(x => x.TraineeCost)
.Column("trainee_cost");
Map(x => x.ArchitectCost)
.Column("architect_cost");
}
}
public class QuotationPerHourMap : SubclassMap<QuotationPerHour>
{
public QuotationPerHourMap()
{
Table("quotation_per_hour");
KeyColumn("quotation_id");
Map(x => x.PaperworkExpenses)
.Column("paperwork_expenses");
Map(x => x.InsuranceTax)
.Column("insurance_tax");
Map(x => x.HourlyOperatingExpenses)
.Column("hourly_operating_expenses");
}
}
public class QuotationPerPercentageMap : SubclassMap<QuotationPerPercentage>
{
public QuotationPerPercentageMap()
{
Table("quotation_per_percentage");
KeyColumn("quotation_id");
Map(x => x.WagePercentage)
.Column("wage_percentage");
}
}
だから今、私の検証として、私は次の3つの方法を使用していますが、どの方法でもエラーが発生します:
[Test]
public void CanCorrectlyMapProject()
{
Project Project = CreateProject();
var HoursSpent = new List<HoursSpent>()
{
CreateHoursSpent(), CreateHoursSpent()
};
using (var transaction = session.BeginTransaction())
{
new PersistenceSpecification<Project>(session)
.CheckProperty(c => c.Name, Project.Name)
.CheckReference(c => c.Client, Project.Client)
.CheckReference(c => c.Quotation, Project.Quotation)
.CheckList(c => c.HoursSpent, HoursSpent, (c, p) => c.AddHoursSpent(p))
.VerifyTheMappings();
}
}
[Test]
public void CanCorrectlyMapQuotationPerHour()
{
QuotationPerHour Quotation = CreateQuotationPerHour();
using (var transaction = session.BeginTransaction())
{
new PersistenceSpecification<QuotationPerHour>(session)
.CheckProperty(c => c.TraineeCost, Quotation.TraineeCost)
.CheckProperty(c => c.ArchitectCost, Quotation.ArchitectCost)
.CheckProperty(c => c.PaperworkExpenses, Quotation.PaperworkExpenses)
.CheckProperty(c => c.InsuranceTax, Quotation.InsuranceTax)
.CheckProperty(c => c.HourlyOperatingExpenses, Quotation.HourlyOperatingExpenses)
.VerifyTheMappings();
}
}
[Test]
public void CanCorrectlyMapQuotationPerPercentage()
{
QuotationPerPercentage Quotation = CreateQuotationPerPercentage();
using (var transaction = session.BeginTransaction())
{
new PersistenceSpecification<QuotationPerPercentage>(session)
.CheckProperty(c => c.TraineeCost, Quotation.TraineeCost)
.CheckProperty(c => c.ArchitectCost, Quotation.ArchitectCost)
.CheckProperty(c => c.WagePercentage, Quotation.WagePercentage)
.VerifyTheMappings();
}
}
最初のものは私に与えます:
Lambda_Services_Project.Tests.PersistenceTests.CanCorrectlyMapProject:
System.ApplicationException : For property 'Quotation' expected type
Lambda_Services_Project.Entities.QuotationPerPercentage' but got
Lambda_Services_Project.Entities.Quotation'
わかりません。Project オブジェクトの引用部分に引用のサブクラスを入れることはできませんか? それが継承を実装する理由だからです。
2 番目と 3 番目のマッピングでは、間違った型マッピングに関するエラーが発生します。
Lambda_Services_Project.Tests.PersistenceTests.CanCorrectlyMapQuotationPerHour:
System.ApplicationException : For property 'InsuranceTax' of type 'System.Single'
expected '3,6' but got '4'
私の他のマッピングでは、オブジェクトの float をデータベースの 10 進数にマップするのに問題はありません。しかし、2 つのサブクラスでは問題が発生します。これは、float プロパティが明らかに System.Single のデータベースに追加されているためです。
問題は nfluent Nhibernate の構成にあると考え始めています。構成の部分がよくわからないため、ここに投稿しました。
private FluentConfiguration GetConfiguration()
{
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(c => c
.Server("")
.Database("")
.Username(""))
.Password(""))
.ShowSql())
.Cache(c => c
.UseQueryCache()
.ProviderClass<HashtableCacheProvider>())
.Mappings(m => m
.FluentMappings
.AddFromAssemblyOf<Client>())
.ExposeConfiguration(x => x
.SetProperty("current_session_context_class", "thread_static"));
}
マッピングを automap に変更してから、ignorebase または includebase を追加しようとしましたが、何も変わりませんでした。私の問題が何であるかについての手がかりを持っている人はいますか?