[英]Fluent NHibernate Inheritance mapping type
我是Fluent NHibernate的新手,到目前為止,除了繼承部分,我設法使映射正常工作。 有誰可以幫助我完成映射? 我已盡可能簡化了代碼。
謝謝!
我的數據庫:
CREATE TABLE [User] (
UserID INT NOT NULL IDENTITY(1,1),
Type CHAR(1) NOT NULL,
Email VARCHAR(255) NOT NULL,
PRIMARY KEY(UserID)
);
CREATE TABLE [Student] (
UserID INT NOT NULL,
Firstname VARCHAR(255) NOT NULL,
PRIMARY KEY(UserID),
FOREIGN KEY(UserID) REFERENCES [User](UserID)
);
CREATE TABLE [Company] (
UserID INT NOT NULL,
Name VARCHAR(255) NOT NULL,
PRIMARY KEY(UserID),
FOREIGN KEY(UserID) REFERENCES [User](UserID),
);
我的課程:
public class User
{
public virtual int UserID { get; set; }
public virtual UserType Type { get; set; }
public virtual string Email { get; set; }
public User()
{
}
}
public class Student : User
{
public string Firstname { get; set; }
public string Lastname { get; set; }
public Student()
: base()
{
}
}
public class Company : User
{
public virtual string Name { get; set; }
public Company()
: base()
{
}
}
public enum UserType
{
STUDENT = 0,
COMPANY = 1
}
對應:
public class UserMap : ClassMap<User>
{
public UserMap()
{
Table("[User]");
Id(x => x.UserID);
Map(x => x.Type).CustomType<int>();
Map(x => x.Email);
}
}
public class CompanyMap : ClassMap<Company>
{
public CompanyMap()
{
Table("Company");
Id(x => x.UserID);
Map(x => x.Name);
}
}
public class StudentMap: ClassMap<Student>
{
public StudentMap()
{
Table("Student");
Id(x => x.UserID);
Map(x => x.Firstname);
Map(x => x.Lastname);
}
}
互聯網上很少有關於Fluent mapping
和NHibernate繼承的好文章。 其中之一是關於mapping-by-code
,但是它也提供了有關Fluent mapping
詳細說明(向下滾動)。
與您的情況有關的小摘錄
... 每課桌
映射繼承的第二種策略是每個類具有連接的子類的表。 在此選項中,子類存儲在單獨的表中,這些表具有基類表的外鍵,並在需要時與基類表聯接。 在這種情況下,在按代碼映射中,我們必須通過繼承JoinedSubclassMapping來映射子類。 這是帶有所有可用選項的聯接子類映射的示例:
public class CompanyMap : JoinedSubclassMapping<Company>
{
public CompanyMap()
{
Key(k =>
{
k.Column("PartyId");
// or...
k.Column(c =>
{
c.Name("PartyId");
// etc.
});
k.ForeignKey("party_fk");
k.NotNullable(true);
k.OnDelete(OnDeleteAction.Cascade); // or OnDeleteAction.NoAction
k.PropertyRef(x => x.CompanyName);
k.Unique(true);
k.Update(true);
});
Property(x => x.CompanyName);
}
}
另一篇非常好的和全面的文章:
Igor Ignatov編寫的Fluent Nhibernate中的繼承映射策略
但是,我建議:
不要這樣走。 如果可能, 不要使用繼承 。 如果必須-不要使用那么深的繼承。
請閱讀以下內容:
小引用:
好處
在繼承中優先考慮組成是一種設計原則,該原則賦予設計更高的靈活性,從長期來看,提供業務域類和更穩定的業務域。 換句話說,HAS-A可能比IS-A關系更好。
通過在單獨的界面中標識系統對象行為,而不是創建層次結構關系以通過繼承在業務域類之間分配行為,簡化了初始設計。 這種方法更容易適應將來的需求更改,否則將需要在繼承模型中對業務域類進行完整的重組。 此外,它避免了通常與對包含幾代類的基於繼承的模型進行相對較小更改有關的問題。
NHibernate是一個非常強大的工具,幾乎可以支持我們的任何願望……但是它仍然不意味着我們應該使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.