web-dev-qa-db-fra.com

Une propriété dépendante dans un ReferentialConstraint est mappée à une colonne générée par le magasin.

Je reçois cette erreur en écrivant dans la base de données:

Une propriété dépendante dans un ReferentialConstraint est mappée sur une colonne générée par le magasin. Colonne: 'PaymentId'.

public bool PayForItem(int terminalId, double paymentAmount, 
      eNums.MasterCategoryEnum  mastercategoryEnum, int CategoryId, int CategoryItemId)
    {

        using (var dbEntities = new DatabaseAccess.Schema.EntityModel())
        {
            int pinnumber = 0;
            long pinid = 1; //getPinId(terminalId,ref pinnumber) ;
            var payment = new DatabaseAccess.Schema.Payment();
            payment.CategoryId = CategoryId;
            payment.ItemCategoryId = CategoryItemId;
            payment.PaymentAmount = (decimal)paymentAmount;
            payment.TerminalId = terminalId;
            payment.PinId = pinid;

            payment.HSBCResponseCode = "";
            payment.DateActivated = DateTime.Now;
            payment.PaymentString = "Payment";
            payment.PromotionalOfferId = 1;
            payment.PaymentStatusId = (int)eNums.PaymentStatus.Paid;

            //payment.PaymentId = 1;

            dbEntities.AddToPayments(payment);
            dbEntities.SaveChanges();
        }
        return true;
    }

Le schéma est:

enter image description here

94
Welsh King

Est-il possible que vous ayez défini une mauvaise relation de colonne entre vos tables? différentes colonnes et une a été définie comme autonumérique.

Il m'est arrivé.

172
ju4nj3

Cette erreur indique que vous utilisez une relation non prise en charge ou que vous avez une erreur dans votre mappage. Votre code est probablement absolument sans rapport avec l'erreur.

L'erreur signifie que vous avez une relation entre des entités où la propriété de clé étrangère dans l'entité dépendante est définie comme générée par le magasin. Les propriétés générées par le magasin sont renseignées dans la base de données. EF ne prend pas en charge les propriétés générées par le magasin en tant que clés étrangères (ni les propriétés calculées dans les clés primaires).

46
Ladislav Mrnka

J'ai eu le même problème. Sur la base des réponses fournies ici, j'ai pu suivre et résoudre le problème, mais j'ai eu un problème étrange décrit ci-dessous - cela pourrait aider quelqu'un à l'avenir.

Sur mes tables dépendantes, les colonnes de clé étrangère ont été définies sur StoreGeneratedPattern = "Identity". Je devais le changer pour "Aucun". Malheureusement, cela n'a pas fonctionné du tout.

J'ai regardé dans le fichier XML généré par le concepteur (SSDL) et ces propriétés étaient toujours là; je les ai donc supprimées manuellement. J'ai également dû corriger les colonnes de la base de données (supprimer l'identité (1,1) de CREATE TABLE SQL)

Après cela, le problème a disparu.

8
surfen

J'ai eu le même problème et après avoir creusé dans la conception de la table dans le serveur SQL, j'ai trouvé à tort que j'ai défini la clé primaire de la table aussi comme clé étrangère.

sql server table design flow

Dans cette image, vous pouvez voir que JobID est la clé primaire de la table, mais également par erreur la clé étrangère.

5
Manish Bhakuni

Si vous avez vérifié vos relations et que vous y êtes bien.

Supprimez la table dans edmx puis mettez à jour à partir de la base de données. Cela vous évitera de faire la mise à jour manuellement.

1
rickjr82

En plus de la réponse acceptée, si vous utilisez le générateur EF Reverse POCO ou un autre outil qui génère vos POCO, assurez-vous de les les régénérer !

1
adam0101

Pour moi, c'était une clé étrangère mal placée dans la table, mais même après avoir modifié la table pour la corriger, cela ne fonctionnait toujours pas. Vous devez mettre à jour les fichiers EDMX (pas assez pour "rafraîchir" la table du modèle, vous devez supprimer et rajouter la table dans le modèle).

1
knocte

Mon problème était dû à la définition redondante de la clé primaire dans la configuration.

this
   .Property(p => p.Id)
   .HasColumnName(@"id")
   .IsRequired()
   .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) // this is redundant when you want to configure a One-to-Zero-or-One relationship
   .HasColumnType("int");

Supprimer cette ligne

.HasDatabaseGeneratedOption (DatabaseGeneratedOption.Identity)


Exemple http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx

Cela suffit pour définir la relation

// Configure Student & StudentAddress entity
modelBuilder.Entity<Student>()
            .HasOptional(s => s.Address) // Mark Address property optional in Student entity
            .WithRequired(ad => ad.Student); // mark Student property as required in StudentAddress entity. Cannot save StudentAddress without Student
1
Piotr

Revérifiez la relation entre Payment et les autres tables/entités. Y compris ceux qui ne devraient pas contenir PaymentId, car c’est là que se cache le problème.

Lors de la création de clés étrangères dans SQL Server Management Studio, la clé primaire est définie par défaut et est rétablie lorsque la table parent est modifiée. Veillez donc à modifier les valeurs dans le bon ordre dans la fenêtre "Tables et colonnes".

En outre, une fois que vous avez corrigé la relation problématique, il est fort probable qu'un simple "Rafraîchir" sur le modèle ne supprime pas correctement la relation erronée du modèle et vous obtiendrez la même erreur même après le "fix ", faites-le vous-même dans le modèle avant d'effectuer une actualisation. (J'ai découvert cela à la dure.)

1
Mark

Dans mon champ d’identification qui FK juste dans Entity Framework, la propriété "StoreGeneratedPattern" était définie sur "Itentity" au lieu de "None"

0
Lev K.

Dans mon cas, le problème était causé par une relation bidirectionnelle 1-1:

class Foo{
[Key]
Id
[ForeignKey]
BarId
...
}
class Bar{
[Key]
Id
[ForeignKey]
FooId
...
}

Je devais simplement retirer l'une des deux clés étrangères (de toute façon pas nécessaire).

0
wecky

Dans mon cas, c’était simplement que je n’avais pas d’autorisations définies correctement sur la base de données. J'avais lu seulement ensemble et Entity Framework me donnait une erreur ReferentialConstraint qui m'a jeté. Ajout d'autorisations d'écriture supplémentaires et tout allait bien.

0
Mdhattr

Dans mon cas, j'avais une propriété Database Generated et une propriété de navigation ForeignKey configurées pour référencer une table connexe 1 à 1.

Ce n'était pas quelque chose que je pouvais supprimer, je devais pouvoir à la fois définir la clé primaire de l'entité pour qu'elle soit générée par la base de données ET j'avais besoin de pouvoir référencer la table 1 pour 1 en tant que propriété de navigation.

Pas sûr que ce soit la même chose pour les autres, mais ce problème apparaissait uniquement lors de la création d'une nouvelle entité, la lecture ou la modification d'entités existantes ne posant pas le problème, j'ai donc contourné le problème en créant une version héritée de mon contexte et en utilisant la méthode Fluent pour désactiver la propriété de navigation lors de la création.

Ainsi, mon entité d'origine ressemblait à ceci:

public partial class MyEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid id{ get; set; }


    // Navigation
    [ForeignKey("id")]
    public PathEntity Path { get; set; }
}

J'ai donc créé un contexte hérité spécial ressemblant à ceci:

    private class _navPropInhibitingContext : EF.ApplicationDBContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<MyEntity>()
                .Ignore(e => e.Path);

        }
    }

et ensuite changé le code qui a créé la nouvelle entité pour rendre l'utilisateur du nouveau type de contexte

    using (var specialContext = new _navPropInhibitingContext())
    {
        var dbModel = new MyEntity() 
        {
            ...
        };

        specialContext.MyEntity.Add(dbModel);
        await specialContext.SaveChangesAsync();
    }

J'espère que ça aide quelqu'un

0
Chris Terry