2013-02-10 165 views
1

1)實體框架和WCF數據成員

我有一個與WCF一起工作的實體框架(v.5)項目。

我的數據庫有一個帳戶表,因此我有一個「帳戶」實體框架對象。 我想揭露的方法:

AddAccount(Account a) 

account參數是從我的數據庫生成的實體框架對象。

每次嘗試使用此服務時,Account的屬性都是空的,我無法理解爲什麼。

這裏是我的代碼的示例:

WCF:

接口:

[OperationContract(Name = "AddAccount")] 
string AddAccount(Account Account); 

實現:由EF產生

public string AddAccount(Account newAccount) 
{ 
    myContext db=new myContext(); 
    db.Accounts.Add(newAccount); 
    db.SaveChanges(); 
    return "something"; 
} 

賬戶級,並且具有int「id」字段和DateTime「Created」字段d。

我的問題是,爲什麼「newAccount」參數是空的?

2)

據我所知,揭露覆雜參數的方法最好的辦法是使用DataContractDataMembers,並提出了,我想問兩個問題。

a)我是否需要將DataContract實現爲實體對象?根據我的理解,不建議直接公開EF對象,但在我想轉移的類上使用DataContract,但另一方面,在嘗試使用我的項目時沒有出現錯誤,該項目沒有實現DataContract帳戶。

b)爲什麼不建議它傳遞EF對象作爲參數,除了讓客戶端了解我的數據庫表的構建?

謝謝。

回答

1

在您的數據庫中,您可以將標識規範分配給id字段,並且可以爲創建的字段賦予默認值。

如果您有id列並且已創建,則需要初始化Created。除非數據庫中沒有身份規範,否則不需要初始化您的id字段。一般來說,您需要初始化您的值,因爲您的數據庫無法猜測應將什麼值分配給您的屬性。

因此,您的實體不是由數據庫創建的,它是由您的方法創建的,因爲您沒有初始化它,所以它是空的。實例的初始化

public string AddAccount() 
{ 
    myContext db=new myContext(); 
    //id is not initialized, because I'm assuming it has an identity specification 
    db.Accounts.Add(new Account() { Created = DateTime.Now.ToUniversalTime()}); 
    db.SaveChanges(); 
    return "something"; 
} 

你的實體類不需要,我的項目的工作無可挑剔使用它們不執行DataContract類的實例EF對象來實現DataContract。

您可以在業務邏輯中將EF對象作爲參數傳遞,這絕對沒有問題。你只需要小心,不要讓你的客戶知道你的數據庫的模式是什麼。

我希望這會有所幫助。

+0

感謝您的評論Lajos,但這不是問題在這裏,顯然我有更多的領域,我必須填寫和「CreationDate」和「ID」只是很多領域的例子 – 2013-02-11 07:25:56

+0

你不明白我的回答,@Rasuli。我的回答告訴你如何初始化創建,這是另一個領域。如果你有更多的字段,並且你打算爲它們存儲初始值,你還需要初始化其他字段。 – 2013-02-11 14:07:49

+0

好的,謝謝你的回答,的確我試圖傳遞這些參數,無論它們是POCO實體還是我定義爲DataContract的類。我現在遇到的問題是,我發送的對象是空的/空屬性,我不明白爲什麼,有趣的是,當我嘗試在WCF測試中測試「AddAccount」時客戶端,參數傳遞時沒有空值,當我嘗試從另一個應用程序中使用此服務時,參數作爲null傳遞。 – 2013-02-11 18:55:33