2010-06-17 4 views
3

Pour commencer j'ai deux tables, PersonNames et PersonNameVariations. Lorsqu'un nom est recherché, il trouve le nom le plus proche de l'un de ceux disponibles dans PersonNames et l'enregistre dans la table PersonNameVariations s'il ne s'y trouve pas déjà.Est-il possible de rendre une colonne non nullable NULL lorsqu'elle est utilisée dans une vue? (serveur sql)

J'utilise un proc stocké pour rechercher le PersonNames pour un passé dans PersonNameVariation et renvoyer les informations sur les deux PersonName trouvé et la PersonNameVariation qui a été comparé. Depuis que j'utilise Entity Framework, j'ai besoin de retourner un type complexe dans le Import Function mais pour une raison quelconque, il dit que mon framework actuel ne le supporte pas. Ma dernière option était d'utiliser un Entity pour retourner dans mon proc stocké à la place.

Le résultat dont j'avais besoin est le PersonName qui a été trouvé et le PersonNameVariation qui a été enregistré. Comme je ne peux pas renvoyer les deux entités, j'ai créé une vue PersonSearchVariationInfo et l'ai ajoutée dans mon Entity Framework afin de l'utiliser comme entité à renvoyer.

Le problème est que la recherche ne retournera pas toujours un Person Name match. Il doit être capable de renvoyer uniquement les données PersonNameVariation dans certains cas, ce qui signifie que tous les champs du PersonSearchVariationInfo appartenant à PersonNamedoivent être NULL.

Comment puis-je prendre ma vue et rendre certains champs nullables? Quand je le fais directement dans Entity Framework, j'obtiens une erreur de mappage:

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

Vous avez des idées?

Merci,
Matt

+0

um. gbn vous a donné une réponse impressionnante jours auparavant. Est-ce que ça marche pour vous ou pas? Si ce n'est pas le cas, pourquoi pas? Si c'est le cas, veuillez accepter sa réponse. – MaasSql

+0

Je vais devoir vérifier ce que j'ai fait. J'ai oublié de mettre à jour cette question après l'avoir compris. Sa réponse ne traitait pas directement ma situation, mais je n'ai peut-être pas été clair avec ce dont j'avais besoin. Je rédigerai quelque chose quand j'aurai une chance et j'essayerai de clarifier ce dont j'avais besoin. – Matt

Répondre

0

Non, vous ne pouvez pas faire une nullable colonne dans une vue, si elle est non annulable dans la table sous-jacente.

Comment voulez-vous faire face à cela ?? Vous insérez une nouvelle ligne dans la vue et laissez cette colonne NULL, mais dans la table sous-jacente, vous devez fournir une valeur .... cela ne fonctionnera tout simplement pas.

+0

Je veux juste sélectionner ... Je ne veux pas insérer dans la vue – Matt

3

Peut-être.

Quand voulez-vous que cela soit nul? Ici, j'utilise NULLIF pour forcer la nullabilité et supposer que j'ai une chaîne vide. YMMV bien sûr.

Les métadonnées est correct pour la nullité de la colonne dans la vue trop

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

Tout simplement magnifique. – MaasSql

Questions connexes