首先,我有两个表,PersonNames
和PersonNameVariations
。搜索名称时,它会找到与PersonNames
中可用的名称之一最接近的名称,并将其记录在PersonNameVariations
表中,如果它尚未存在于其中。
我正在使用存储过程搜索PersonNames
传入的PersonNameVariation
,并返回找到的PersonName
和PersonNameVariation
的信息。它
由于我使用的是实体框架,我需要在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
有人有什么想法吗?
谢谢,
马特
答案 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,但在基础表中,您将不得不提供一个值....它将无效。