Créer une à une relation en utilisant entity framework première base de données
Dans EF Premier Code, nous pouvons créer une relation de code comme ceci:
public class User
{
public int UserID {get;set;}
public string Name {get;set;}
public int UserDetailID {get;set;}
public UserDetail Detail {get;set;}
}
public class UserDetail
{
public int UserDetailID {get;set;}
public string Address {get;set:}
public int UserID {get;set;}
public User User {get;set;}
}
Cependant, lorsque j'ai essayé de créer la même relation en utilisant EF première Base de données dans visual studio 2012, je suis dans le pétrin. Voici mon code:
CREATE TABLE [dbo].[Users] (
[UserID] UNIQUEIDENTIFIER CONSTRAINT [DF_Users_UserID] DEFAULT (newid()) NOT NULL,
[UserDetailID] UNIQUEIDENTIFIER NOT NULL,
[Name] NVARCHAR (50) NOT NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([UserID] ASC),
CONSTRAINT [FK_Users_UserDetails] FOREIGN KEY ([UserDetailID]) REFERENCES [UserDetails]([UserDetailID])
);
CREATE TABLE [dbo].UserDetails] (
[UserDetailID] UNIQUEIDENTIFIER CONSTRAINT [DF_UserDetails_UserDetailID] DEFAULT (newid()) NOT NULL,
[UserID] UNIQUEIDENTIFIER NOT NULL,
[Address] NVARCHAR(100) NOT NULL,
CONSTRAINT [PK_UserDetails] PRIMARY KEY CLUSTERED ([UserDetailID] ASC),
CONSTRAINT [FK_UserDetails_Users] FOREIGN KEY ([UserID]) REFERENCES [dbo].[Users] ([UserID])
Le message d'erreur est quelque chose comme
"Error 2 SQL01767: Foreign key 'FK_Users_UserDetails' references invalid table 'UserDetails'.
Je pense que la raison de cette erreur probablement être quand il essaie de faire référence à la clé étrangère "UserDetailID", il constate qu'il n'a pas encore été créé. Mais je ne sais pas comment résoudre ce problème, et je ne sais même pas c'est la façon de le faire, je sais faire des one-to-one relation avec EF est délicat, ou certaines personnes ont même dit que c'est impossible. Quelqu'un peut-il me donner une suggestion? Merci.
Mise à jour: Juste pour clarifier mon cas, je suis en train de concevoir la base de données dans visual studio 2012 projet de base de données, puis de les publier sur le serveur SQL server, par la suite, créer/mettre à jour mon .fichier edmx à partir de la base de données dans SQL server. Je ne suis pas sûr de savoir comment créer un one-to-one relation que l'EF peut reconnaître correctement et de créer les classes .fichier edmx.
vous avez besoin de faire deux tables avant de vous essayez d'insérer la clé étrangère.
Veuillez voir ma mise à jour. Merci.
vous ne devriez pas être à l'aide de la Base de données tout d'Abord, vous devriez être en utilisant le Premier Modèle, il a été spécialement conçu pour ces situations.
OriginalL'auteur yan | 2013-06-22
Vous devez vous connecter pour publier un commentaire.
La création d'une relation 1:1 n'est pas difficile et certainement pas impossible, mais ce n'est pas particulièrement une exigence commune et dans ce cas je ne vois pas pourquoi vous le souhaitez? Si les gens sont en train de dire, c'est que vous parlez à des gens mal.
De toute façon, à l'aide de requêtes SQL que vous semblez être, c'est de ne pas le faire avec EF, vous sont tout simplement de travailler directement avec la base de données, Dans la première de CRÉER vous tentez d'ajouter la contrainte, mais vous n'avez pas créé de l'autre table... Comme vous l'avez mentionné dans votre question.
Je pense que vous avez besoin pour créer les deux tables, puis ajouter la contrainte avec ALTER TABLE.
En outre la recherche DONC, pour des questions à propos de 1:1 tourne beaucoup alors je vous suggère de le faire.
EDIT: Alors, à l'aide d'un projet de base de données (je n'ai que VS Express donc je n'ai pas de ceux-ci) vous souhaitez créer un "1:1" relation à l'aide de SQL, puis ajoutez un Modèle de Données d'Entité à un (probablement différents) projet qui fait référence à la base de données et de créer automatiquement relation 1:1?
C'est une toute autre histoire, malheureusement. Quand je parlais possibilité de créer 1:1 qui était en référence à EF seulement et non à des bases de données en tant que telle. Il est effectivement très difficile/impossible comme vous l'avez dit pour créer 1:1 en SQL. Je pense qu'il fait sens que dans le but de les insérer dans un rapport de 1:1 hiérarchiques vous devez en quelque sorte s'insérer dans les deux tables exactement au même moment ou à propos de violon avec la désactivation des contraintes brièvement lors de l'ajout de lignes.
En général il ya quelques options différentes.
Ne pas séparer les tables inutilement. En vrai 1:1 toutes les données est nécessaire, de sorte que la seule raison de split est pour des raisons de performances (e.g partioning) qui, je veux éviter dans ce cas.
Carte multiple de table à une seule entité comme le montrent ici.
Créer un rapport de 1:0..1 relation et de vous appliquer les exigences propres à l'application.
Dans l'option 2 ou 3, vous pouvez utiliser la requête SQL suivante pour créer une relation qui utilise la même PK sur la deuxième table de la FK dans la relation.
Je vous suggère également d'utiliser, stocker généré identité ainsi quand vous le pouvez.
Il est assez facile de créer des tables, puis ajouter des contraintes à l'aide de l'instruction ALTER TABLE où vous pouvez trouver des infos sur, MSDN ou n'importe où. Cependant, je ne pense pas que cela va vous aider à... voir la mise à jour de réponse.
Merci à vous, vous avez mon point de vue, la pensée j'ai toujours le problème...j'ai voulu voter pour votre réponse, mais malheureusement je n'ai pas assez de réputation. Je vous remercie encore.
J'ai dû relire cette réponse pour déterminer que vous avez réellement fournir une réponse (au départ, j'ai arrêté de lire quand j'ai pris cette ligne, Il est effectivement très difficile/impossible comme vous l'avez dit pour créer 1:1 dans SQL').. c'était bien trop bavard.. pourquoi avez-vous quitté la partie où vous preniez la question ( qui était presque enitrely commentaire en premier lieu)?
OriginalL'auteur Dave Williams
Juste enlever UserDetailID de la UserDetail table et faire UserID à la fois de clé primaire et de clé étrangère à la UserID colonne de la Utilisateur table.
- Ce la bonne façon de faire de 1:1 des relations dans une base de données et de l'EF, il reconnaît et cartes les entités de façon appropriée avec la base de données de la première approche.
OriginalL'auteur Yulian
La question est de quelques années plus vieux.. et l'ef version n'était pas indiqué.. mais une seule réponse est de supprimer
UserDetailID
des deux tables.UserID
devrait être la seule clé primaire sur les deux tableaux.le "unqieidentifier' (GUID) type de données ne devrait pas poser de problème (contrairement à l'utilisation INT), mais vous ne voulez certainement pas de le remplir avec des newId..
OriginalL'auteur Brett Caswell