Properti dependen dalam ReferentialConstraint dipetakan ke kolom yang dibuat di toko

98

Saya mendapatkan kesalahan ini saat menulis ke database:

Properti dependen dalam ReferentialConstraint dipetakan ke kolom yang dibuat di toko. Kolom: '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;
    }

Skemanya adalah:

masukkan deskripsi gambar di sini

Raja Welsh
sumber

Jawaban:

180

Apakah mungkin Anda mendefinisikan relasi kolom yang buruk antara tabel Anda? kolom yang berbeda dan satu ditetapkan sebagai autonumerik.

Itu terjadi pada saya.

ju4nj3
sumber
55
Saya salah membuat salah satu kunci asing saya menjadi Identitas (kenaikan otomatis). Ini adalah kesalahan yang saya dapatkan.
jocull
3
Doh! Saya telah meninggalkan bagian kunci asing dari hubungan sebagai default yang diberikan oleh SQL Server 2008 Management Studio, yang merupakan bidang kunci utama dari tabel anak, bukan kolom yang telah saya buat untuk memuat nilai kunci asing.
perampok
12
Jika Anda memeriksa pengecualian di jendela Tonton Cepat (yaitu (e as System.Data.Entity.Infrastructure.DbUpdateException).Entries), Anda dapat melihat tabel mana yang berisi kunci utama yang direferensikan.
Cᴏʀʏ
17
Bukankah lebih keren jika pesan kesalahan EF hanya menyatakan apa masalahnya daripada melontarkan gobbledy-gook?
AR
Saya menggunakan kueri ini untuk melihat semua hubungan dalam satu tampilan stackoverflow.com/questions/8094156/…
Dave
47

Kesalahan ini mengatakan bahwa Anda menggunakan hubungan yang tidak didukung atau Anda memiliki kesalahan dalam pemetaan Anda. Kode Anda kemungkinan besar sama sekali tidak terkait dengan kesalahan tersebut.

Kesalahan berarti Anda memiliki beberapa hubungan antara entitas di mana properti kunci asing di entitas dependen didefinisikan sebagai penyimpanan yang dihasilkan. Properti yang dihasilkan toko diisi dalam database. EF tidak mendukung properti yang dihasilkan toko sebagai kunci asing (serta properti yang dihitung dalam kunci utama).

Ladislav Mrnka
sumber
2
saya dapat menambahkan baris di server sql dengan info yang sama. ketika Anda mengatakan Store Generated, dapatkah Anda memberi contoh?
Raja Welsh
1
EF bukan SQL Server. Itu memiliki batasannya sendiri. Cukup temukan di mana Anda menggunakan properti FK yang dihasilkan DB yang dipanggil PaymentIDdan tangani.
Ladislav Mrnka
ok kita memiliki tabel riwayat pembayaran yang memiliki paymentId sebagai kunci asing, apakah saya perlu menambahkan baris di sana?
Raja Welsh
Ini bukan tentang menambahkan baris tetapi tentang definisi kolom. Bagaimana Anda mengatur kolom itu?
Ladislav Mrnka
cukup klik model hubungan di studio visual dan saya mendapatkan Nama 'Pembayaran' tidak dapat digunakan dalam jenis 'Pembayaran'. nama anggota tidak boleh sama dengan tipe lampirannya. Ada ide
Raja Welsh
8

Saya memiliki masalah yang sama. Berdasarkan jawaban yang diberikan di sini saya dapat melacak dan menyelesaikannya, tetapi saya memiliki masalah aneh yang dijelaskan di bawah - ini mungkin membantu seseorang di masa depan.

Pada tabel dependen saya, kolom kunci asing telah diatur ke StoreGeneratedPattern = "Identity". Saya harus mengubahnya menjadi "Tidak Ada". Sayangnya, melakukannya di dalam desainer tidak berhasil sama sekali.

Saya melihat di XML yang dihasilkan desainer (SSDL) dan properti ini masih ada di sana, jadi saya menghapusnya secara manual. Saya juga harus memperbaiki kolom pada database (menghapus Identity (1,1) dari CREATE TABLE SQL)

Setelah itu, masalahnya hilang.

surfen
sumber
Terima kasih atas tip ini. Mengubah bidang di desainer dari Identity ke None mengubah ini di satu tempat di EDMX, tetapi tidak di tempat lain, jadi saya masih mendapatkan kesalahan sampai saya mengedit file EDMX sendiri. Sayangnya EntityFramework kemudian menjadi gila dan mencoba memasukkan kembali entitas terkait di tabel lain, tetapi tetap saja, itu adalah bantuan untuk melewati pesan kesalahan itu.
FTWinston
6

Saya memiliki masalah yang sama dan setelah menggali beberapa desain tabel di sql server, saya menemukan bahwa saya secara keliru menetapkan kunci utama tabel juga sebagai kunci asing.

aliran desain tabel server sql

Dalam gambar ini, Anda dapat melihat bahwa JobID adalah kunci utama tabel tetapi juga kunci asing yang salah.

Manish Bhakuni
sumber
2

Masalah saya disebabkan oleh pendefinisian yang berlebihan dari kunci utama dalam konfigurasi.

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

Hapus baris ini

.HasDatabaseGeneratedOption (DatabaseGeneratedOption.Identity)


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

Ini cukup untuk mendefinisikan hubungan

// 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
Piotr
sumber
1

Periksa kembali hubungan antara Pembayaran dan tabel / entitas lain. Menyertakan salah satu yang tidak boleh berisi PaymentId karena di situlah kemungkinan besar masalahnya bersembunyi.

Saat membuat kunci asing di SQL Server Management Studio, kunci utama adalah default, dan default ini dikembalikan saat tabel induk diubah, jadi berhati-hatilah untuk mengubah nilai dalam urutan yang benar di jendela "Tabel dan Kolom".

Selain itu, setelah Anda memperbaiki hubungan yang bermasalah, ada kemungkinan besar bahwa "Segarkan" sederhana pada model tidak akan benar menghapus hubungan yang salah dari model dan Anda akan mendapatkan kesalahan yang sama bahkan setelah " perbaiki ", jadi lakukan ini sendiri dalam model sebelum melakukan penyegaran. (Saya menemukan ini dengan cara yang sulit.)

Menandai
sumber
1

Jika Anda telah memeriksa hubungan Anda dan baik di sana.

Hapus tabel di edmx dan kemudian perbarui dari database. Ini akan membantu Anda melakukan pembaruan secara manual.

rickjr82.dll
sumber
Benar-benar terima kasih atas saran Anda, saya menghabiskan 1 jam untuk memvalidasi database saya, tetapi setelah dihapus kemudian diperbarui, semuanya baik-baik saja.
Tấn Nguyên
1

Bagi saya itu adalah kunci asing yang salah ditempatkan di tabel tetapi bahkan setelah mengubah tabel untuk memperbaikinya, itu masih tidak berfungsi. Anda perlu memperbarui file EDMX (dan tidak cukup untuk "menyegarkan" tabel dari model, Anda perlu menghapus dan menambahkan tabel lagi dalam model).

knocte
sumber
1

Selain jawaban yang diterima, jika Anda menggunakan generator EF Reverse POCO atau alat lain yang menghasilkan POCO, pastikan Anda memperbaruinya !

adam0101
sumber
Jangan pernah lupa untuk menjalankan ulang Alat T4 Kustom Anda (menahan POCO) setelah memodifikasi generator model EF DB-first eksternal Anda (memegang konteks) ... PERNAH! XD (juga bisa jadi gila -.- ')
Shockwaver
0

Dalam kasus saya, masalahnya disebabkan oleh hubungan dua arah 1-1:

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

Saya harus menghapus salah satu dari dua kunci asing (toh tidak perlu).

wecky
sumber
0

Dalam kasus saya, hanya saja saya tidak memiliki izin yang ditetapkan dengan benar pada database. Saya telah membaca set saja dan kerangka kerja entitas memberi saya kesalahan ReferentialConstraint yang membuat saya bingung. Menambahkan izin menulis tambahan dan semuanya baik-baik saja.

Mdhattr
sumber
0

Dalam kasus saya, saya memiliki properti Database Generated, dan properti navigasi ForeignKey yang disiapkan untuk mereferensikan tabel terkait 1 hingga 1.

Ini bukan sesuatu yang bisa saya hapus, saya harus bisa mengatur kunci utama entitas menjadi Database Generated DAN saya harus bisa mereferensikan tabel 1 ke 1 sebagai properti navigasi.

Tidak yakin apakah ini sama untuk orang lain, tetapi masalah ini hanya muncul saat membuat entitas baru, membaca atau mengedit entitas yang ada tidak menunjukkan masalah, jadi saya mengatasi masalah dengan membuat versi yang diwariskan dari Konteks saya dan menggunakan metode Fluent untuk menonaktifkan properti navigasi saat membuat.

Jadi, entitas asli saya terlihat seperti ini:

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


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

Jadi saya membuat konteks warisan khusus yang terlihat seperti ini:

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

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

        }
    }

dan kemudian mengubah kode yang membuat entitas baru untuk membuat pengguna tipe konteks baru

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

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

Semoga ini bisa membantu seseorang

Chris Terry
sumber
0

Dalam kasus saya, bidang Id yang FK hanya dalam Entity Framework propierty "StoreGeneratedPattern" ditetapkan "Itentity" bukan "None"

Lev K.
sumber