2010-06-17 26 views
3

要開始我有兩個表,PersonNamesPersonNameVariations。搜索名稱時,它會找到與PersonNames中可用的名稱最接近的名稱,並將其記錄在PersonNameVariations表中(如果它尚未存在)。在視圖中使用時,是否可以創建不可爲空的列? (sql server)

我使用一個存儲過程來搜索PersonNamesPersonNameVariation一個傳遞和返回上發現的PersonName和比較它的PersonNameVariation雙方的信息。

由於我使用的是實體框架,我需要在Import Function中返回一個複雜類型,但由於某種原因它說我目前的框架不支持它。我最後的選擇是使用Entity來替代我的存儲過程。

我需要的結果是找到的PersonName和記錄的PersonNameVariation上的信息。由於我無法返回兩個實體,因此我創建了一個視圖PersonSearchVariationInfo並將其添加到我的實體框架中,以便將其用作要返回的實體。

問題是,搜索將不會總是返回一個Person Name匹配。在某些情況下,它需要只能返回PersonNameVariation數據,這意味着PersonSearchVariationInfo中與PersonName有關的所有字段需要爲空,即

我該如何看待自己的觀點並將其中的某些欄位設爲空?當我在實體框架直接做,我得到一個映射錯誤:

Error 4 Error 3031: Problem in mapping fragments starting at line 1202:Non-nullable column myproject_vw_PersonSearchVariationInfo.DateAdded in table myproject_vw_PersonSearchVariationInfo is mapped to a nullable entity property. C:\Users\Administrator\Documents\Visual Studio 2010\Projects\MyProject\MyProject.Domain\EntityFramework\MyProjectDBEntities.edmx 1203 15 MyProject.Domain

人有什麼想法?

謝謝
馬特

+0

庵爲空性是正確的。幾天前,gbn給了你一個很棒的回答。它是否適用於你?如果沒有,爲什麼不呢?如果有,請接受他的回答。 – MaasSql 2010-06-26 22:54:34

+0

我必須檢查我做了什麼。我想出來後忘了更新這個問題。他的回答沒有直接說明我的情況,但我可能不清楚我需要什麼。當我有機會嘗試澄清我所需要的東西時,我會寫點東西。 – Matt 2010-06-29 21:58:42

回答

0

不,你不能在一個視圖中的列空的,如果是在基礎表中的非空。

你會如何處理?您在視圖中插入一個新行並將該列保留爲NULL,但是在基礎表中,您必須提供一個值....這是行不通的。

+0

我只想選擇...我不想插入視圖 – Matt 2010-06-29 21:53:37

3

也許吧。

你什麼時候可以空?這裏我使用NULLIF來強制可空性,並假設我有空字符串。 YMMV當然。

元數據是列在視圖太

CREATE TABLE dbo.Foo (ColNonNull varchar(100) NOT NULL) 
GO 
INSERT dbo.Foo VALUES (NULL) --fails 
GO 
INSERT dbo.Foo VALUES ('bar') --works 
INSERT dbo.Foo VALUES ('') --works 
GO 
CREATE VIEW dbo.vwFoo 
AS 
SELECT NULLIF(ColNonNull, '') AS ColNull FROM dbo.Foo 
GO 
SELECT * FROM dbo.vwFoo 
GO 
SELECT 
    COLUMNPROPERTY(OBJECT_ID('dbo.Foo'), 'ColNonNull', 'AllowsNull') AS TableColNullable, 
    COLUMNPROPERTY(OBJECT_ID('dbo.vwFoo'), 'ColNull', 'AllowsNull') AS ViewColNullable 
GO 
+0

簡單漂亮。 – MaasSql 2010-06-26 22:55:54

相關問題