2011-06-03 55 views
1

我試圖讓此業務類繼承DAL類型(客戶端)的屬性。如何使類繼承DAL表的屬性並插入

客戶端是表。

這是總線類,從表客戶越來越屬性

public class BusClient : Client 
    { 
     public void Insert() 
     { 
      using(MyBIEntities db = new MyBIEntities()) 
      { 
       db.AddToClients(this); //Here's the problem (don't know what to pass) 
       db.SaveChanges(); 
      } 
     } 

     public bool Validate() 
     { 
      //Validation Rules goes here. 
      return true; 
     } 
    } 

這些Web窗體調用:

try 
    { 
     BusClient client = new BusClient(); 

     //Filling properties from Client (table) in the BusClient object all OK. 
     client.CityId = int.Parse(ddlCity.SelectedValue()); 
     client.Name = txtName.Text; 
     client.RegisterDate = Convert.ToDateTime("txtDate.Text"); 

     if (client.Validate()) 
     { 
      client.Insert(); 
     } 
    } 
    catch (Exception ex) 
    { 
     //Catching errors 
    } 

的問題顯然是我不能越過BusClient類型插入..但我已經填滿了所有這些屬性,將Validate()Insert()方法使用它們的最佳方法是什麼?

另一件事:避免在我嘗試驗證()之前發生在表單上的類型異常/錯誤(服務器端)的最佳做法是什麼?

+0

'MyBIEntities'可能是'IDisposable'實現,所以你應該在'Insert'方法的'using'塊中包裝這些語句。 – 2011-06-03 15:02:33

+0

感謝您指點。已完成 – 2011-06-03 15:14:16

+0

此BusClient類的用途是什麼?爲什麼不直接將'Insert'和'Validate'這兩個方法直接放入'Client'類(這可以解決插入正確類型的問題)? – Slauma 2011-06-03 17:24:53

回答

0

正如你已經看到你不能通過BusClientAddToClients。你將不得不通過複製這是相當醜陋的屬性在Insert方法來創建從一個BusClientClient

public void Insert() 
{ 
    using(MyBIEntities db = new MyBIEntities()) 
    { 
     Client client = new Client(); 

     client.CityId = this.CityId; 
     client.Name = this.Name; 
     client.RegisterDate = this.RegisterDate; 

     db.AddToClients(client); 
     db.SaveChanges(); 
    } 
} 

重新思考設計。從實體(Client)派生類(BusClient)我看不到任何好處。如果你不能改變Client類,你可以創建一個分機方法...

public static class Extensions 
{ 
    public static bool Validate(this Client client) 
    { 
     // Run validation rules on client object 
    } 
} 

...或者一個單獨的類爲您的驗證:

public class Validator 
{ 
    public bool Validate(Client client) 
    { 
     // Run validation rules on client object 
    } 
} 

我也會三思這個獨立Insert方法。雖然這可能適用於您的示例,但只要您必須操作更復雜的對象圖形,就會造成麻煩(或至少無用)。在這種情況下,您將需要一個ObjectContext來執行整個操作。對於每個INSERT,UPDATE或DELETE等,您不能再使用單獨的ObjectContext工作。

所以,我建議從您的特殊類中刪除數據庫操作並將其放入主例程中。那麼整個事情看起來是這樣:

try 
{ 
    using(MyBIEntities db = new MyBIEntities()) 
    { 
     Client client = new Client(); 

     client.CityId = int.Parse(ddlCity.SelectedValue()); 
     client.Name = txtName.Text; 
     client.RegisterDate = Convert.ToDateTime("txtDate.Text"); 

     if (client.Validate()) 
     // works with the extension method, or with the Validator use: 
     // Validator validator = new Validator(); 
     // if (validator.Validate(client)) 
     { 
      db.AddToClients(client); 
      db.SaveChanges(); 
     } 
    } 
} 
catch (Exception ex) 
{ 
    //Catching errors 
} 

BusClient類不會再在這個例子中存在。