ReferentialConstraintの依存プロパティは、ストアによって生成された列にマップされます


98

データベースに書き込むときにこのエラーが発生します。

ReferentialConstraintの依存プロパティは、ストアによって生成された列にマップされます。列:「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;
    }

スキーマは次のとおりです。

ここに画像の説明を入力してください

回答:


180

テーブル間に不適切な列関係を定義した可能性はありますか?異なる列と1つが自動数値として設定されました。

それは私に起こりました。


55
外部キーの1つを誤ってID(自動インクリメント)にしました。これは私が得たエラーです。
ジョクル2012年

3
どー!リレーションシップの外部キーの部分は、SQL Server 2008 Management Studioによって指定されたデフォルトのままにしました。これは、外部キー値を含むために作成した列ではなく、子テーブルの主キーフィールドでした。
robaker

12
クイックウォッチウィンドウ(つまり(e as System.Data.Entity.Infrastructure.DbUpdateException).Entries)で例外を調べると、参照されている主キーを含むテーブルを確認できます。
Cᴏʀʏ

17
EFのエラーメッセージが、ゴブルディグックを吐き出すのではなく、問題が何であるかを述べただけでいいのではないでしょうか。
AR

私は1つのビュー内のすべての関係表示するには、このクエリを使用しstackoverflow.com/questions/8094156/...
デイブ・

47

このエラーは、サポートされていない関係を使用しているか、マッピングにエラーがあることを示しています。コードはおそらくエラーとはまったく無関係です。

エラーは、依存エンティティの外部キープロパティがストア生成として定義されているエンティティ間に何らかの関係があることを意味します。ストア生成プロパティはデータベースに入力されます。EFは、外部キーとしてのストア生成プロパティ(および主キーの計算されたプロパティ)をサポートしていません。


2
同じ情報を使用してSQLサーバーに行を追加できます。Store Generatedと言うとき、例を挙げていただけますか?
ウェールズキング

1
EFはSQL Serverではありません。独自の制限があります。呼び出されたDBによって生成されたFKプロパティを使用する場所を見つけ、PaymentIDそれを処理するだけです。
Ladislav Mrnka、2011年

OK、paymentIdを外部キーとして持つpaymenthistoryテーブルがあります。そこに行を追加する必要がありますか?
ウェールズキング

行の追加ではなく、列の定義についてです。どのようにその列を設定しますか?
Ladislav Mrnka、2011年

Visual Studioでリレーションシップモデルをクリックしただけで、名前「支払い」を取得できません。タイプ「支払い」では使用できません。メンバー名は、それらを囲むタイプと同じにすることはできません。任意のアイデア
ウェルシュキング

8

私も同じ問題を抱えていました。ここで提供された回答に基づいて、追跡して解決することができましたが、以下に説明する奇妙な問題がありました。これは、将来誰かを助けるかもしれません。

私の従属テーブルでは、外部キー列がStoreGeneratedPattern = "Identity"に設定されています。「なし」に変更する必要がありました。残念ながら、内部デザイナーでこれを行うことはまったく機能しませんでした。

デザイナーが生成したXML(SSDL)を調べたところ、これらのプロパティはまだ残っていたため、手動で削除しました。また、データベースの列を修正する必要がありました(CREATE TABLE SQLからIdentity(1,1)を削除してください)。

その後、問題はなくなりました。


このヒントをありがとう。デザイナーのフィールドをIdentityからNoneに変更すると、これはEDMXの1つの場所では変更されましたが、他の場所では変更されなかったため、自分でEDMXファイルを編集するまでエラーが発生しました。残念ながらEntityFrameworkは気が狂って他のテーブルに関連エンティティを再挿入しようとしましたが、それでもそのエラーメッセージを回避するのに役立ちました。
FTWinston 2016

6

同じ問題があり、SQLサーバーのテーブル設計を少し調べた後、誤ってテーブルの主キーも外部キーとして設定していたことがわかりました。

SQLサーバーテーブルの設計フロー

この画像では、JobIDがテーブルの主キーであるが、誤って外部キーでもあることがわかります。


2

私の問題は、構成内の主キーの冗長な定義が原因でした。

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");

この行を削除

.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)


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

これは関係を定義するのに十分です

// 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

Paymentと他のテーブル/エンティティの関係を再確認します。問題が非表示になっている可能性が高いため、PaymentIdを含めるべきではないものを含めます。

SQL Server Management Studioで外部キーを作成すると、主キーがデフォルトになり、このデフォルトは親テーブルが変更されると元に戻されるため、[テーブルと列]ウィンドウで正しい順序で値を変更するように注意してください。

また、問題のある関係を修正した後、モデルの単純な「更新」でモデルからエラーのある関係が正しく削除されず、「修正」の後でも同じエラーが発生する可能性が高くなります。更新を実行する前に、モデルで自分でこれを実行してください。(私はこれを難しい方法で見つけました。)


1

あなたがあなたの関係をチェックし、そこで良い場合。

edmxのテーブルを削除してから、データベースから更新します。これにより、更新を手動で行う必要がなくなります。


本当にあなたのアドバイスに感謝します、私は私のデータベースを検証するのに1時間を費やしましたが、削除してから更新した後、すべてが大丈夫です。
タングエン

1

私にとっては、テーブルに誤って配置された外部キーでしたが、テーブルを変更して修正しても、まだ機能していませんでした。EDMXファイルを更新する必要があります(モデルからテーブルを「更新」するには不十分であり、モデルからテーブルを削除して再度追加する必要があります)。


1

受け入れられた回答に加えて、EF Reverse POCOジェネレーターまたはPOCOを生成するその他のツールを使用している場合は、 それら再生成してください。


外部のDBファーストEFモデルジェネレーター(コンテキストを保持)を変更した後、カスタムT4ツール(POCOを保持)を再実行することを忘れないでください。XD(クレイジーになったかもしれません-.- ')
Shockwaver

0

私の場合、問題は双方向の1対1の関係が原因でした。

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

2つの外部キーの1つを削除するだけでした(とにかく必要ありません)。


0

私の場合は、データベースに適切な権限が設定されていなかっただけです。私は読み取り専用のセットを持っていて、EntityフレームワークがReferentialConstraintエラーを出して、それが私をスローしました。追加の書き込み権限を追加し、すべてが順調でした。


0

私の場合、データベース生成プロパティと、1対1の関連テーブルを参照するように設定されたForeignKeyナビゲーションプロパティがありました。

これは私が削除できるものではなく、エンティティの主キーをデータベース生成に設定できるようにする必要があり、ナビゲーションプロパティとして1対1のテーブルを参照できるようにする必要もありました。

これが他のユーザーでも同じかどうかはわかりませんが、この問題は新しいエンティティを作成するときにのみ発生し、既存のエンティティの読み取りまたは編集では問題が発生しなかったため、コンテキストの継承バージョンを作成して使用することで問題を回避しました作成時にナビゲーションプロパティをオフにするFluentメソッド。

したがって、元のエンティティは次のようになりました。

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


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

そこで、次のような特別な継承コンテキストを作成しました。

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

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

        }
    }

次に、新しいエンティティを作成するコードを変更して、新しいコンテキストタイプのユーザーを作成します

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

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

これが誰かを助けることを願っています


0

私の場合、エンティティフレームワークのFKのIdフィールドで、プロピアティ "StoreGeneratedPattern"が "None"ではなく "Itentity"に設定されていました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.