【问题标题】:Is it possible to make a non-nullable column nullable when used in a view? (sql server)在视图中使用时是否可以使不可为空的列可以为空? (SQL服务器)
【发布时间】:2011-03-04 19:10:38
【问题描述】:

首先我有两张桌子,PersonNamesPersonNameVariations。搜索名称时,它会找到与 PersonNames 中可用名称之一最接近的名称,并在 PersonNameVariations 表中不存在时将其记录。

我正在使用存储过程在 PersonNames 中搜索传入的 PersonNameVariation,并返回找到的 PersonName 和与之比较的 PersonNameVariation 的信息。

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

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

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

我怎样才能接受我的观点并使某些字段可以为空?当我直接在实体框架中执行此操作时,出现映射错误:

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

有人有什么想法吗?

谢谢,
马特

【问题讨论】:

  • 嗯。 gbn 几天前给了你一个很棒的答案。它对你有用吗?如果没有,为什么不呢?如果是,请接受他的回答。
  • 我必须检查我做了什么。我弄清楚后忘记更新这个问题了。他的回答没有直接解决我的情况,但我可能不清楚我需要什么。有机会我会写一些东西并尝试澄清我需要什么。

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


【解决方案1】:

也许吧。

您希望它何时可以为空?在这里,我使用 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

【讨论】:

    【解决方案2】:

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

    你会怎么处理?您在视图中插入一个新行并将该列保留为 NULL,但在基础表中,您必须提供一个值....这不起作用。

    【讨论】:

    • 我只想选择...我不想插入到视图中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2012-12-24
    • 2013-04-11
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多