2011-03-21 36 views
2

問候!多租戶EF執行W /存儲過程

我在實體框架內使用SPROCs來處理所有的CRUD方法。由於這是一個多租戶數據庫,因此我們在每個表中都有一個clientID字段。我們的DBA不希望公開該客戶端ID,因此我們將用戶名傳遞給SPROC(用戶名,在成員資格提供者中跟蹤),然後在用戶名內部將用戶名轉換爲客戶端ID。

我遇到的問題是我的實體沒有用戶名屬性。當我爲插入/更新/刪除創建函數導入時,映射正在請求一個用戶名字段(必需,來自我的SPROC),該字段在我的實體中不存在。這裏是我的架構:

帳戶實體

賬戶號碼
AccountDescription
的ClientID
ActiveFlag
RowVersion(併發)

我的存儲過程:

ALTER PROCEDURE [dbo].[GetAccounts] 
@Username varchar (60) 
AS 

/********************************************* 
Summary: Get Accounts 
2011-01-20 aca initial version 
2011-01-27 aca Alias for Description 
2011-03-21 aca Implement user security 
********************************************/ 
select P.FERC_ACCOUNT, 
    P.[DESCRIPTION] as AccountDescription, 
    P.RowVersion 
from dbo.P_ACCOUNTS P 
join dbo.v_UserClient U 
on U.Username = @Username 
and P.CLIENT_ID = U.Client_ID 
where P.ActiveFlag = 1; 

RETURN 0; 

我不確定最好的處理方式是什麼。我只是在我的實體中創建一個用戶名屬性?那意味着我必須對每一個人都這樣做?我如何填充它?等等:)

感謝您的幫助!

Scott

+0

你能通過部分課程添加嗎? – 2011-03-22 02:16:47

+0

我當然知道部分類是什麼(我的域服務被分解爲每個實體集的一個部分類,以適應更新我的模型,然後不必更新將構成我的ds的所有200個方法),但你可以解釋更多我將如何實施,爲什麼? – 2011-03-22 09:33:31

+0

這是一個SL項目嗎?您是否將實體映射到特效或您是否直接調用導出的函數。 – 2011-03-22 16:22:13

回答

1

我有相同的限制,我導出存儲過程作爲函數。對於沒有輸出參數的過程,我返回默認生成的複雜類型,即GetAccountsResult。

public IEnumerable<GetAccountsResult> GetAccounts(string username) 
{ 
    return ObjectContext.GetAccounts(username).AsQueryable(); 
} 

複雜類型需要具有指定爲[Key]的屬性。要爲複雜類型設置密鑰,我爲我的域服務創建一個部分,並使用好友類來設置密鑰。所以對於AccountsDomainService.cs,我創建AccountsDomainService.metadata.cs。

[MetadataType(typeof(GetAccountsResultMetadata))] 
    public partial class GetAccountsResult 
{ 
    internal sealed class GetAccountsResultMetadata 
    { 
     [Key] 
     public int Id { get; set; } 
    } 
} 

對於那些具有輸出參數的過程創建包含用於輸出參數和另一POCO對象相匹配的複雜類型的屬性一個POCO對象。然後我使用AutoMapper將返回的複雜類型映射到我創建的複雜類型。我這樣做,所以我可以返回關係。

Account.cs

public class Account 
    { 
     [Key] 
     public int Id { get; set; } 
     public string MyOutputParameter { get; set; } 

     [Include, Association("Account_AccountDetails", "Id", "AccountId")] 
     public List<AccountDetail> AccountDetails { get; set; } 
    } 

AccountDetail.cs

public class AccountDetail 
    { 
     [Key] 
     public int Id { get; set; } 
     public int AccountId { get; set; } 
     public string MyAccountDetailProperty { get; set; } 
    } 

AccountDomainService.cs

public Account GetAccountsWithOutputParms(string username) 
     { 
      var myOutputParameter = new ObjectParameter("MyOutPutParameter", typeof(int)); 

      var tempGetAccountsResult = ObjectContext.GetAccounts(username).ToList(); 

      var account = new Account 
           { 
            Id = 1, 
            MyOutputParameter = myOutputParameter, 
            AccountDetails = Mapper.Map<List<GetAccountsResult>, List<AccountDetail>>(tempGetAccountsResult) 
           }; 

      return accout; 
     } 

當我在客戶端上的結果,我使用AutoMapper將它們映射到客戶端視圖模型。

This文章EF 4和RIA Services存儲過程非常方便。

對於插入/更新,您可以創建一個poco對象來模擬過程參數並將其傳遞到您的域服務中的導出函數。

+0

這當然聽起來像是正確的答案,所以我打算將它標記爲這樣。該鏈接的網站已關閉,我基本上一直持續到今天上午,或者與EF一起前進。我之前沒有使用過AutoMapper,我不得不做更多的研究來理解你所做的一些事情,這些我根本沒有時間。我感謝你的幫助......當我有更多的帶寬時,我一定會重新審視這個問題。謝謝德里克。 – 2011-03-23 17:25:51

+0

http://thegrayzone.co.uk/blog/tag/wcf-ria-services/它似乎現在工作。 – 2011-03-23 18:01:02

+0

AutoMapper不是必須的。沒有它就可以將一個對象映射到另一個對象。如果你有更多的問題,我們可以把它帶到電子郵件。 derek.beattie在Gmail。 – 2011-03-23 18:05:01