在视图中使用时,是否可以使不可为空的列可为空? (sql server)

时间:2010-06-17 05:31:23

标签: sql sql-server entity-framework view mapping

首先,我有两个表,PersonNamesPersonNameVariations。搜索名称时,它会找到与PersonNames中可用的名称之一最接近的名称,并将其记录在PersonNameVariations表中,如果它尚未存在于其中。

我正在使用存储过程搜索PersonNames传入的PersonNameVariation,并返回找到的PersonNamePersonNameVariation的信息。它

由于我使用的是实体框架,我需要在Import Function中返回一个复杂的类型,但出于某种原因,它说我当前的框架不支持它。我的最后一个选择是使用Entity代替我的存储过程。

我需要的结果是找到的PersonName和记录的PersonNameVariation的信息。由于我无法返回两个实体,因此我创建了一个视图PersonSearchVariationInfo并将其添加到我的实体框架中,以便将其用作要返回的实体。

问题在于搜索不会始终返回Person Name匹配。在某些情况下,它需要能够仅返回PersonNameVariation数据,这意味着与PersonSearchVariationInfo 相关的PersonName中的所有字段都需要为空()。

我如何看待自己的观点并使一些字段可以为空?当我直接在实体框架中执行它时,我得到一个映射错误:

  

错误4错误3031:从第1202行开始映射片段时出现问题:表中的不可为空的列myproject_vw_PersonSearchVariationInfo.DateAdded myproject_vw_PersonSearchVariationInfo被映射到可空的实体属性。       C:\ Users \ Administrator \ Documents \ Visual Studio 2010 \ Projects \ MyProject \ MyProject.Domain \ EntityFramework \ MyProjectDBEntities.edmx 1203 15 MyProject.Domain

有人有什么想法吗?

谢谢,
马特

2 个答案:

答案 0 :(得分:4)

也许

你什么时候想要它可以为空?在这里,我使用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

答案 1 :(得分:0)

如果在基础表中不可为空,则不能在视图中使列可以为空。

你会怎么处理?您在视图中插入一个新行并将该列保留为NULL,但在基础表中,您将不得不提供一个值....它将无效。