2012-12-18 107 views
1

我正在嘗試創建與數據庫交互的應用程序。從基地訪問屬性或父類

我用很多語言編寫程序,我喜歡在基於MVC的應用程序中使用模型是多麼容易。

所以我的問題是,試圖複製這一功能,我有2類,如下所示:

基類:

public class BaseModel 
{ 
    protected string TableName { get; set; } 

    public BaseModel() 
    {   
    } 

    public void Save() 
    { 
     // Save data in derived class to table stored in TableName 
    } 
} 

派生類:

public class UserModel : BaseModel 
{ 
    public string Field1 { get; set; } 
    public string Field2 { get; set; } 

    public UserModel() 
    { 
     base.TableName = "user"; 
    } 
} 

從我的主要應用,我希望能夠做到以下幾點:

public class Class1 
{ 
    public Class1() 
    { 
     UserModel model = new UserModel(); 
     model.Field1 = "Value1"; 
     model.Field2 = "Value2"; 
     model.Save(); 
    } 
} 

這裏是我遇到問題的地方。我不能爲我的生活弄清楚,我將如何訪問UserModel中的屬性,以便它們可以保存到UserModel的構造函數中指定給BaseModel的數據庫表中。

希望這是有道理的。 :)

此代碼不是我的工作代碼,它是一個非常簡單的表示形式,因此我想實現的目的是爲了便於閱讀而將字段和屬性(驗證程序等)降低。

+1

您應該使用實體框架,它已經這樣做。 – SLaks

+0

我可能只是希望C#能夠做一些PHP可以做的事情:( – Stuart

+0

C#可以做到這一點(使用Reflection)但是,不要重新發明輪子 – SLaks

回答

0

這通常通過在基級使用抽象函數來解決,然後用派生類中的細節覆蓋它們。所以會在基礎中建立一個調用樹,但是需要知道派生類的細節的函數將在派生類中實現。

public class BaseModel 
{ 
    protected string TableName { get; set; } 

    public BaseModel() 
    {   
    } 

    public abstract void Save(); 
} 

在這種情況下,你有一個具體的數據表現體現在基類可能是最好創建一個DTO對象,業務類採取的利用。這是大多數框架如實體的接近。

1

我認爲,一個更加「真實」的例子實際上有助於更好地理解,但我認爲你應該建立在基類虛擬(或甚至抽象)方法得到的數據在數據庫中保存:

public class BaseModel { 

    protected virtual string GetDataToSaveInDB() { 
     // if it makes sense to have the data as a string... 
    } 

    public void Save() { 
     string data = GetDataToSaveInDB(); 
     // do something with data... 
    } 
} 

然後你在派生類返回數據:

public class UserModel : BaseModel { 
    protected override string GetDataToSaveInDB() { 
     return "Field1=" + Field1 + ";Field2=" + Field2; 
    } 
} 

這只是爲了說明這個概念,如果你提供這將是更方便地提供一個真正的答案的詳細信息。

如何將數據保存到數據庫中?桌子的結構如何?

+0

表的結構是鏡像的所以在我的示例中,用戶表將Field1和Field2作爲字段,當我從應用程序中調用保存時,我應該將派生類Field1和Field2屬性中保存的值保存到用戶表的Field1和Field2中。所有我想知道的是(如果可能的話)我如何讓BaseModel訪問派生類的屬性,因爲重寫save方法似乎毫無意義,因爲我試圖實現,因爲我可能在每個方法中都有一個保存方法我的模型班。 – Stuart

+0

那麼,你可能有其他選擇,比如使用反射來獲取屬性名稱和值......我不知道它是否值得。 –