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 lors de l'écriture dans la base de données:

Une propriété dépendante dans un ReferentialConstraint est mappée à 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:

entrez la description de l'image ici

86
demandé sur Gilles 2011-06-17 14:50:53

11 réponses

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 autonumeric.

Ça m'est arrivé.

155
répondu ju4nj3 2011-08-08 11:40:59

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 les entités où la propriété de clé étrangère dans l'entité dépendante est définie comme un magasin généré. Les propriétés générées par le magasin sont remplies 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 (ainsi que les propriétés calculées dans les clés primaires).

45
répondu Ladislav Mrnka 2011-06-17 10:56:23

J'ai eu le même problème. Sur la base des réponses fournies ici, j'ai pu le suivre et le résoudre, 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". J'ai dû changer à "None". Malheureusement, le faire à l'intérieur designer n'a pas fonctionné du tout.

J'ai regardé dans le XML généré par le concepteur (SSDL) et ces propriétés étaient toujours là, donc j'ai supprimé - les manuellement. J'ai également dû réparer 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.

7
répondu surfen 2012-03-31 00:02:48

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

flux de conception de table sql server

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

4
répondu Manish Bhakuni 2018-08-17 11:54:44

Si vous avez vérifié vos relations et êtes bon là-bas.

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

1
répondu rickjr82 2015-02-24 14:28:29

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 réparer, cela ne fonctionnait toujours pas. Vous devez mettre à jour les fichiers EDMX (et pas assez pour "actualiser" la table du modèle, vous devez supprimer et ajouter la table à nouveau dans le modèle).

1
répondu knocte 2016-04-12 05:11:06

Revérifiez la relation entre le paiement et les autres tables / entités. Y compris ceux qui ne devraient pas contenir PaymentId parce que c'est là que le problème se cache le plus probablement.

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 cette valeur par défaut 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".

Aussi, après avoir corrigé le problème dans la relation, il y a de fortes chances qu'un simple "rafraîchissement" 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", alors faites-le vous-même dans le modèle avant d'effectuer un rafraîchissement. (J'ai trouvé cela la manière dure.)

0
répondu Mark 2013-05-30 14:18:21

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

0
répondu adam0101 2016-09-13 16:37:22

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

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

J'ai dû simplement supprimer l'une des deux clés étrangères (pas nécessaire de toute façon).

0
répondu wecky 2017-02-15 11:14:37

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

0
répondu Mdhattr 2017-08-28 12:57:42

Dans mon cas, j'avais une propriété générée par la base de données et une propriété de navigation ForeignKey configurée pour référencer une table liée à 1 à 1.

Ce n'était pas quelque chose que je pouvais Supprimer, je devais être capable à la fois de définir la clé primaire de l'entité à générer une base de données et de pouvoir référencer la table 1 à 1 en tant que propriété de navigation.

Je ne sais pas si c'est la même chose pour les autres, mais ce problème n'apparaissait que lors de la création d'une nouvelle entité, de la lecture ou de l'édition existante les entités n'ont pas présenté le problème, donc j'ai 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.

Donc, 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 qui ressemblait à ceci:

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

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

        }
    }

Puis a 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 cela aide quelqu'un

0
répondu Chris Terry 2017-12-21 15:42:30