2017-08-22 5 views
0

Je suis assez nouveau pour EF, alors j'espère que ce n'est pas une question stupide. J'ai cherché, mais je n'ai rien trouvé de relatif à mon problème.EF6 Base de données Premier problème de multiplicité de table par type sur la clé étrangère

J'ai rencontré des problèmes lors de la modélisation d'une base de données existante dans EF6. J'ai la configuration de l'héritage TPT comme suit:

TPT model Je dois ajouter manuellement les tables d'environnement BAMS * en raison de problèmes de création du modèle. Tout va bien jusqu'à ce que j'ajoute la clé étrangère de BAMSPortalEnvironment à BAMSPrimeEnvironment. Pour un environnement Prime donné, il peut exister ou non un environnement Portal, mais pour chaque environnement Portal, il existe un environnement Prime.
je reçois l'erreur suivante de VS2017:

transformation en cours: Multiplicité est pas valable dans le rôle « BAMSPortalEnvironment » en relation « FK_BAMSPortalEnvironment_BAMSPrimeEnvironment ». Comme les propriétés du rôle dépendant ne sont pas les propriétés clés, la limite supérieure de la multiplicité du rôle dépendant doit être *.

modèle simplifié des tableaux correspondants:

CREATE TABLE dbo.Environment(
    EnvironmentId  int IDENTITY(1,1) NOT NULL, 
    EnvironmentTypeId char(1) NOT NULL, 
    [Description]  varchar(64) NOT NULL, 
    CONSTRAINT UQ_Environment UNIQUE NONCLUSTERED (EnvironmentId ASC) ON [PRIMARY], 
    CONSTRAINT PK_Environment PRIMARY KEY CLUSTERED (EnvironmentId ASC, EnvironmentTypeId ASC) ON [PRIMARY] 
) ON [PRIMARY]; 

CREATE TABLE dbo.BAMSPrimeEnvironment(
    EnvironmentId  int NOT NULL, 
    EnvironmentTypeId AS CAST('B' AS char(1)) PERSISTED NOT NULL, 
    CONSTRAINT FK_BAMSPrimeEnvironment_Environment FOREIGN KEY (EnvironmentId, EnvironmentTypeId) REFERENCES dbo.Environment (EnvironmentId, EnvironmentTypeId) ON UPDATE NO ACTION ON DELETE CASCADE, 
    CONSTRAINT PK_BAMSPrimeEnvironment PRIMARY KEY CLUSTERED (EnvironmentId ASC, EnvironmentTypeId ASC) ON [PRIMARY] 
) ON [PRIMARY]; 

CREATE TABLE dbo.BAMSPortalEnvironment(
    EnvironmentId  int NOT NULL, 
    EnvironmentTypeId AS CAST('P' AS char(1)) PERSISTED NOT NULL, 
    BAMSPrimeId   int NOT NULL, 
    BAMSPrimeTypeId  AS CAST('B' AS char(1)) PERSISTED NOT NULL, 
    CONSTRAINT FK_BAMSPortalEnvironment_BAMSPrimeEnvironment FOREIGN KEY (BAMSPrimeId, BAMSPrimeTypeId) REFERENCES dbo.BAMSPrimeEnvironment (EnvironmentId, EnvironmentTypeId) ON UPDATE NO ACTION ON DELETE NO ACTION, 
    CONSTRAINT FK_BAMSPortalEnvironment_Environment FOREIGN KEY (EnvironmentId, EnvironmentTypeId) REFERENCES dbo.Environment (EnvironmentId, EnvironmentTypeId) ON UPDATE NO ACTION ON DELETE CASCADE, 
    CONSTRAINT UQ_BAMSPortalEnvironment_BAMSPrimeId_BAMSPrimeTypeId UNIQUE NONCLUSTERED (BAMSPrimeId ASC, BAMSPrimeTypeId ASC) ON [PRIMARY], 
    CONSTRAINT PK_BAMSPortalEnvironment PRIMARY KEY CLUSTERED (EnvironmentId ASC, EnvironmentTypeId ASC) ON [PRIMARY] 
) ON [PRIMARY]; 

je peux « corriger » en changeant le « 0..1 » à « * », mais qui ne décrit pas exactement mon modèle. Qu'est-ce qui me manque pour que ça marche?

Ceci est mon premier article, donc si vous avez besoin d'informations supplémentaires, faites le moi savoir.

Merci!

+0

Est-il utile si vous appliquez une contrainte unique sur 'BAMSPrimeEnvironment', quelque chose comme ça,' – ironstone13

+0

Je ne comprends pas la suggestion 'CONTRAINTE UQ_EnvironmentID_EnvironmentType UNIQUE NONCLUSTERED (ASC EnvironmentId, EnvironementType) ON [PRINCIPAL]. La table a déjà une clé primaire sur ces colonnes, ce qui est unique. AFAIK, EF6 ne supporte pas les contraintes uniques, seulement les clés primaires. –

+0

Oh, désolé je n'ai pas remarqué que vous aviez déjà un * composite * PK sur * les deux * de ces colonnes, je pensais que c'était seulement sur 'EnvironmentId'. C'est très étrange, dans les deux tableaux, vous avez des PK composites donc cette relation est clairement "0..1" et non "*". Peut-être EF ne supporte-t-il pas un tel scénario, et traite chaque FK comme un un à plusieurs implicitement? – ironstone13

Répondre

0

Je n'ai pas trouvé de solution, donc à la place de BAMSPortalEnvironment référençant BAMSPrimeEnvironment, je l'ai changé à la référence Environnement, qui a résolu ce problème.