2017-04-08 242 views
0

繼承我是新來的實體框架和我在網上跟着教程創建我的SQL Server數據庫,並提出了一些模型和上下文類,包括屬性來訪問它們。實體框架 - 從模型

這是我的個人戶口模式:

public class Account 
{ 
    public int ID { get; set; } 
    public string Username { get; set; } 
    public string Password { get; set; } 
} 

這是我的上下文類:

public class DashContext : DbContext 
{ 
    public DashContext() 
    : base(Constants.ConnectionString) 
    { 
     this.Configuration.LazyLoadingEnabled = true; 
     this.Configuration.ProxyCreationEnabled = false; 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     Database.SetInitializer<DashContext>(null); 
    } 

    public DbSet<Account> Accounts { get; set; } 
} 

這工作 - 當我訪問DbSet財產我可以訪問所有的帳戶entires在我的數據庫。

但是,我想創建一個Account類的實現,它包含的屬性不僅僅是列,因爲它必須與我的程序進行交互。

所以,我試圖做到以下幾點:

public class GameAccount : Account 
{ 
    public int SomeSpecialProperty { get; set; } 
} 

然而,當我使用我的上下文類來獲取Account對象,我不知道如何將它轉換爲GameAccount。我知道我可以創建一個構造函數,複製特性從AccountGameAccount,像這樣:

public class GameAccount 
{ 
    public int ID { get; private set; } 
    public string Username { get; private set; } 
    public string Password { get; private set; } 

    public GameAccount(Account model) 
    { 
     this.ID = model.ID; 
     this.Username = model.Username; 
     this.Password = model.Password; 
    } 
} 

...但似乎有點inefficent給我,我敢肯定有一個簡單的方法。

您認爲如何?

+0

創建像'公共DbSet 遊戲帳戶的上下文中的另一個屬性{獲取;集;}'有你有所有這些行。 – dcg

+0

@dcg這是不正確的。實體框架將嘗試查詢名爲「GameAccount」的表。 –

回答

0

Copy Constructors可能是非常昂貴的開發和維護。通常生成的實體框架的類是部分的。

BradleyDotNET說明:

當生成代碼;你不希望你的額外的方法/屬性/不管什麼都消失,所以設計師將這些類標記爲partial,以允許用戶將其他代碼放入不同的文件中。

因此,一個可能的方法是具有附加屬性擴展類

public partial class Account 
{ 
    public int ID { get; set; } 
    public string Username { get; set; } 
    public string Password { get; set; } 
} 

public partial class Account 
{ 
    public int SomeSpecialProperty { get; set; } 
} 
+0

你幾乎是對的。但在這種情況下沒有代碼生成,因爲它是代碼優先的方法。 – CodingYoshi

+0

@CodingYoshi是的,但他只是從生成的代碼中給出了例子。這可能是我的解決方案 - 但是讓我的類分離並仍然指定相同的名稱空間似乎有點奇怪。我不能使用不同的命名空間嗎? –

+0

@GilbertWilliams不,部分類必須寫在同一個命名空間中(查看http://stackoverflow.com/questions/4504288/partial-class-in-different-namespaces) – Fruchtzwerg

1

您有幾種選擇:

選項1

通過Fruchtzwerg指示使用partial類。

選項2

您可以使用AutoMapper從一種類型的項目映射到其他。這裏有一個例子:

// Notice the ReverseMap call. That will allow mapping in both directions. 
Mapper.Initialize(cfg => 
    cfg.CreateMap<Account, GameAccount>().ReverseMap()); 
var account = Mapper.Map<Account>(new GameAccount()); 
var gameAccount = Mapper.Map<GameAccount>(account);