XAF應用開發教程(三)業務對象模型之引用類型與關聯關系


本節介紹信息系統開發中最常見的問題,引用關系,一對多關系,多對多關系。

 

以客戶信息為例,客戶通常需要客戶分類,如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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM