本節介紹信息系統開發中最常見的問題,引用關系,一對多關系,多對多關系。
以客戶信息為例,客戶通常需要客戶分類,如VIP客戶,普通客戶,潛在客戶。當然,我們可以定義枚舉類型進行定義出這個類型,並在客戶類上面定義對應的屬性。
但枚舉類型增加值需要修改程序,而客戶分類很可能是會增加或是修改的,此時,我們就需要用到了引用類型。引用類型對應到數據庫上,也就是外鍵關系。
既然是需要可以維護的客戶分類,那么我們應該建立一張表出來,在XPO中就要新建出一個業務類,代碼如下:
[DefaultClassOptions]
[XafDefaultProperty("名稱")] public class 客戶分類 : BaseObject { public 客戶分類(Session s):base(s) { } private string _名稱; public string 名稱 { get { return _名稱; } set { SetPropertyValue("名稱", ref _名稱, value); } } }
代碼相當的簡單,只有一個屬性。運行系統后,客戶分類已經出現在菜單中,接下來,要在客戶中填加客戶分類屬性。
private 客戶分類 _客戶分類; public 客戶分類 客戶分類 { get { return _客戶分類; } set { SetPropertyValue("客戶分類", ref _客戶分類, value); } }
接下來按下F5運行系統,看看效果。
從導航欄點擊客戶,再次點擊新建,可以看到如下效果的編輯器。你的運行效果中沒有VIP和普通用戶這兩個值嗎?
對的,可以直接點擊圖中所示的倒數第二個按鈕,可以新建出可選項。
回過頭來看一下我們新使用的屬性:
[DefaultClassOptions] [XafDefaultProperty("名稱")] public class 客戶分類 : BaseObject { ..... }
可以看到客戶分類上面使用了新的Attribute,XafDefaultPropertyAttribute,它的功能是:當類實例被顯示時,使用哪個屬性做為顯示值,如果去掉這句話效果如下:
可以看出來,顯示的是類的全名(一串GUID),這個GUID就是主鍵字段的值。后面如果看到這種情況,你應該知道需要設置XafDefaultProperty就好了。
引用型字段使用的是搜索編輯器,當數據條數大於25時,將會自動的顯示為彈出搜索窗口。我們可以手工向客戶分類表中新建超過25條記錄。
可以看到,這時的圖標變成了望遠鏡,點擊后,彈出窗口:
在彈出窗口中,按下搜索按鈕,就顯示出了所有記錄。當然還有很多可以控制的選項,但本節主要介紹引用型關系的使用,所以不做深入討論,后面會詳細介紹。
再來看看數據庫中表的變化,客戶分類字段已經建立出來,並且是外鍵。這種建立外鍵的機制對數據完整性有很好的約束。當然也是可以不建立出外鍵的。
下面再來看看一對多關系的建立方法,有這樣的需求:一個客戶有多個聯系人,一個聯系人只屬於一個客戶。
我們先新建一個聯系人類型:
[XafDefaultProperty("名稱")] public class 聯系人 : BaseObject { public 聯系人(Session s):base(s) { } private string _名稱; public string 名稱 { get { return _名稱; } set { SetPropertyValue("名稱", ref _名稱, value); } } private 客戶 _客戶; [Association] public 客戶 客戶 { get { return _客戶; } set { SetPropertyValue("客戶", ref _客戶, value); } } }
同時,在客戶類中填加一個集合屬性:
public class 客戶....... { ............. [Association] public XPCollection<聯系人> 聯系人 { get { return GetCollection<聯系人>("聯系人"); } } .............. }
這里可以看到,在客戶類中 聯系人屬性是 xpcollection<聯系人> ,而在聯系人類中,有客戶屬性,它們都用了[Association]進行了標記。
是的,這個標記就是用來建立關聯關系的。F5運行一下看看效果吧!
在客戶列表中,點擊新建,可以看到下方多了一個聯系人列表,是的,這里可以存儲多個聯系人信息了。在聯系人列表上,可以點擊“New"按鈕進行填加數據了。
下面再來看看多對多關系的建立,在實現項目開發中,有這樣一種情形,公司為了銷售業務,通常會有業務大區的概念,一個客戶可能存在於兩個業務大區中,如
公司銷售在上海市普陀區,嘉定區均有營業網點,客戶在嘉定區居住,但離普陀區很近,可能去普陀區銷費,那么我們可以建立大區類、和客戶類是多對多的關聯關系:
[NavigationItem("基礎數據")] [XafDefaultProperty("名稱")] public class 銷售大區 : BaseObject { public 銷售大區(Session s ):base(s) { } private string _名稱; public string 名稱 { get { return _名稱; } set { SetPropertyValue("名稱", ref _名稱, value); } } [Association] public XPCollection<客戶> 客戶 { get { return GetCollection<客戶>("客戶"); } } }
上面的代碼就新建出了銷售大區類型,可以看到新建的類型上我使用了
[NavigationItem("基礎數據")]這樣一個Attribute,它的功能是在導航菜單中,建一個導航分組,並把銷售大區這個業務對象的列表顯示在里面。
public class 客戶..... { .................. [Association] public XPCollection<銷售大區> 所屬大區 { get { return GetCollection<銷售大區>("所屬大區"); } } ................... }
在客戶類中增加一個所屬大區屬性,如上所示,這樣一個對多對關系就建立完成了。可以看出,和一對多其實是一樣的,只是兩個類中都用xpcollection<T>這個泛型類即可。
還是F5看下效果吧:
可以看到,銷售大區被放到了基礎數據下面點擊后,出現了銷售大區的列表,這時,還沒有數據。

在銷售大區上點擊新建,可以看到客戶列表出現在銷售大區的詳細界面中了。這里點擊Link按鈕,可以選擇大區所擁有的客戶。
同樣的,來看客戶信息:

這時,所屬大區被放到了第二個Tab頁面中,XAF會判斷有幾個子級列表類型的集合,而建立出Tab.
如果你一直和我一樣,一直使用中文編碼,點開所屬大區會是空白的,這是Dev的BUG,將會在15.2.5版本中修復,臨時的解決方法是這樣的:
解決方案->XCRMDemo.Web->WebApplication.cs,右鍵,查看代碼,來到構造函數中,加入如下語句:
public XCRMDemoAspNetApplication() { InitializeComponent(); DelayedViewItemsInitialization = false; }
這句話的意思是Tab中的內容不是在點擊時生成的,對性能上會有些影響,后面的版本中BUG修復了就沒有問題了。
這個BUG的原因是因為瀏覽器中的cookieName使用了中文編碼,而chrome,firefox,都不支持,在safari瀏覽器中沒有這個問題。
瀏覽器我一直推薦使用chrome,速度快!
學習了上面的三節知識后,就可以構建多數的表結構了,怎么樣快試試吧!
QQ:4603528 QQ群:336090194