データベースへの書き込み時にこのエラーが発生します。
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;
}
スキーマは次のとおりです。
テーブル間に不適切な列関係を定義した可能性はありますか?異なる列と1つが自動数値として設定されました。
それは私に起こりました。
このエラーは、サポートされていないリレーションを使用しているか、マッピングにエラーがあることを示しています。あなたのコードは、おそらく間違いなくエラーとは無関係です。
エラーは、依存エンティティの外部キープロパティがストア生成として定義されているエンティティ間に何らかの関係があることを意味します。ストアで生成されたプロパティはデータベースに入力されます。 EFは、生成されたプロパティを外部キーとして保存しません(また、プライマリキーの計算されたプロパティも)。
同じ問題がありました。ここで提供された回答に基づいて、私はそれを追跡して解決することができましたが、以下に説明する奇妙な問題がありました-それは将来誰かを助けるかもしれません。
従属テーブルでは、外部キー列がStoreGeneratedPattern = "Identity"に設定されています。 「なし」に変更する必要がありました。残念ながら、デザイナー内でそうすることはまったく機能しませんでした。
デザイナーが生成したXML(SSDL)を調べましたが、これらのプロパティはまだ存在していたため、手動で削除しました。また、データベースの列を修正する必要がありました(CREATE TABLE SQLからIdentity(1,1)を削除します)
その後、問題はなくなりました。
私は同じ問題を抱えており、SQL Serverのテーブルデザインを掘り下げた後、誤ってテーブルの主キーを外部キーとして設定していることがわかりました。
この画像では、JobIDがテーブルの主キーであると同時に、誤って外部キーであることがわかります。
あなたはあなたの関係をチェックし、そこに良い場合。
Edmxのテーブルを削除してから、データベースから更新します。これにより、更新を手動で行う必要がなくなります。
受け入れられた答えに加えて、EF Reverse POCOジェネレーターまたはPOCOを生成する他のツールを使用している場合は、regenerateそれらを確認してください!
私にとっては、テーブルに誤って配置された外部キーでしたが、テーブルを変更して修正した後でも、それはまだ機能していませんでした。 EDMXファイルを更新する必要があります(モデルからテーブルを「更新」するには十分ではありません。モデルからテーブルを削除して再度追加する必要があります)。
私の問題は、構成内の主キーの重複定義によって引き起こされました。
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)
これは関係を定義するのに十分です
// 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
支払いと他のテーブル/エンティティとの関係を再確認します。 PaymentIdを含めるべきではないものを含めると、問題が隠れている可能性が最も高いためです。
SQL Server Management Studioで外部キーを作成すると、主キーがデフォルトになり、親テーブルが変更されるとこのデフォルトに戻ります。そのため、[テーブルと列]ウィンドウで正しい順序で値を変更してください。
また、問題のある関係を修正した後、モデルの単純な「更新」ではモデルから誤った関係が正しく削除されない可能性が高く、「fix "ですので、リフレッシュを実行する前にモデルでこれを自分で行ってください。 (これは難しい方法だとわかりました。)
私の場合、FKがEntity FrameworkにあるIDフィールドは、「StoreGeneratedPattern」というプロパティが「None」ではなく「Itentity」に設定されていました。
私の場合、問題は双方向の1-1関係を持っていることが原因でした。
class Foo{
[Key]
Id
[ForeignKey]
BarId
...
}
class Bar{
[Key]
Id
[ForeignKey]
FooId
...
}
2つの外部キーのいずれかを削除する必要がありました(とにかく必要ありません)。
私の場合、データベースに適切に設定された権限を持っていなかったというだけでした。私は読み取り専用セットを使用していたため、Entity FrameworkからReferentialConstraintエラーが発生し、それが原因で私を失望させました。追加の書き込み許可を追加しましたが、すべて順調でした。
私の場合、データベース生成プロパティと、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();
}
これが誰かを助けることを願っています