如何映射繼承實體我試圖到AdventureWorks 2012示例數據庫映射到EF 6.1.3代碼第一數據層,和我停留在如何將Employee
和Person
實體映射。員工顯然應該從Person
派生,Person.PersonType
的EM
,但我不知道如何使用EntityTypeConfiguration<TEntity>
'映射'類來映射它。知道這一點,我也可以映射Person
派生自BusinessEntity
。在EF代碼優先
Q
在EF代碼優先
2
A
回答
0
我將解釋如何執行Employee
和使用代碼優先方法的Person
表之間的映射,可以按照相同的步驟BusinessEntity
和Person
之間進行映射繼承。
使用的繼承映射策略是TPT(Table Per Type),我創建了一個簡單的控制檯應用程序,安裝了AdventureWorks2012數據庫後,我跟着EF DataModel嚮導生成了我將修改爲映射的代碼第一類繼承,因此,這裏的結果代碼:
Person類:
public partial class Person
{
[Key]
public int BusinessEntityID { get; set; }
[Required]
public string PersonType { get; set; }
public bool NameStyle { get; set; }
public string Title { get; set; }
[Required]
public string FirstName { get; set; }
public string MiddleName { get; set; }
[Required]
public string LastName { get; set; }
public string Suffix { get; set; }
public int EmailPromotion { get; set; }
[Column(TypeName = "xml")]
public string AdditionalContactInfo { get; set; }
[Column(TypeName = "xml")]
public string Demographics { get; set; }
}
Employee類:
public partial class Employee: Person
{
[Required]
public string NationalIDNumber { get; set; }
[Required]
public string LoginID { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public short? OrganizationLevel { get; set; }
[Required]
public string JobTitle { get; set; }
[Column(TypeName = "date")]
public DateTime BirthDate { get; set; }
[Required]
public string MaritalStatus { get; set; }
[Required]
public string Gender { get; set; }
[Column(TypeName = "date")]
public DateTime HireDate { get; set; }
public bool SalariedFlag { get; set; }
public short VacationHours { get; set; }
public short SickLeaveHours { get; set; }
public bool CurrentFlag { get; set; }
public Guid rowguid { get; set; }
public DateTime ModifiedDate { get; set; }
}
最後的AW上下文類:
public partial class AW : DbContext
{
public AW()
: base("name=AWConnectionString")
{
}
public virtual DbSet<Employee> Employees { get; set; }
public virtual DbSet<Person> People { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>().ToTable("Person.Person");
modelBuilder.Entity<Employee>().ToTable("HumanResources.Employee");
}
}
一個簡單的測試(這對我的作品;)):
class Program
{
static void Main(string[] args)
{
using(var db= new AW())
{
var e = db.Employees.First();
e.JobTitle = "Web Developper";
db.SaveChanges();
}
}
}
您可以參考this文章瞭解更多詳細信息,
相關問題
- 1. EF代碼優先 -
- 2. 與EF代碼優先
- 3. 繼承EF代碼優先
- 4. EF代碼優先外鍵
- 5. EF代碼優先 - System.InvalidOperationException
- 6. MVC4 - EF代碼優先
- 7. 如何在EF代碼優先
- 8. EF代碼優先 - 在填充模型
- 9. 許多在EF代碼優先
- 10. Northwind在EF代碼優先的示例
- 11. EF 4.1代碼優先映射問題
- 12. EF代碼優先的對稱關係
- 13. 用EF代碼優先鎖定
- 14. C#EF代碼優先 - 級聯更新
- 15. EF代碼優先4.1 xml XElement
- 16. EF代碼優先與兩個DbContexts
- 17. 一個DbSet的EF代碼優先PluralizingTableNameConvention
- 18. EF代碼優先 - 型物業類型
- 19. EF代碼優先映射視圖
- 20. EF代碼優先:型號配置
- 21. MVC3:EF代碼優先和認證
- 22. EF代碼優先:定義外鍵
- 23. 使用EF代碼優先本地extention
- 24. EF 4.1代碼優先 - 添加列
- 25. EF代碼優先,播種和部署
- 26. EF代碼優先和確認字段
- 27. CTP5 EF代碼優先問題
- 28. EF 6代碼優先遷移跳過
- 29. EF代碼優先的子查詢4.1
- 30. EF代碼優先1:* 1:同款
員工應該獲得人,你必須給他們相同的PK(讓員工使用繼承的PersonID密鑰)。 EF將正確映射它們。 –
https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-con-crete-type-tpc-and-choosing-strategy - 指引和相關帖子 –