ReferentialConstraint'teki bağımlı bir özellik, mağaza tarafından oluşturulan bir sütuna eşlenir


98

Veritabanına yazarken şu hatayı alıyorum:

ReferentialConstraint'teki bağımlı bir özellik, mağaza tarafından oluşturulan bir sütuna eşlenir. Sütun: "Ödeme Kimliği".

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;
    }

Şema şudur:

görüntü açıklamasını buraya girin

Yanıtlar:


181

Tablolarınız arasında kötü bir sütun ilişkisi tanımlamış olmanız mümkün mü? farklı sütunlar ve biri otomatik sayısal olarak ayarlandı.

Bana oldu.


55
Yanlışlıkla yabancı anahtarlarımdan birini Kimlik (otomatik artış) yaptım. Aldığım hata bu.
jocull

3
Doh! İlişkinin yabancı anahtar kısmını, yabancı anahtar değerini içermek için oluşturduğum sütunu değil, alt tablonun birincil anahtar alanları olan SQL Server 2008 Management Studio tarafından verilen varsayılan olarak bırakmıştım.
robaker

12
Hızlı İzleme penceresinde (yani (e as System.Data.Entity.Infrastructure.DbUpdateException).Entries) istisnayı incelerseniz, hangi tablonun referans verilen birincil anahtarı içerdiğini görebilirsiniz.
Cᴏʀʏ

17
EF hata mesajları, sorunun ne olduğunu belirtmek yerine gobbledy-gook'u ifade etseydi harika olmaz mıydı?
AR

Tüm ilişkileri tek bir görünümde görüntülemek için bu sorguyu kullandım stackoverflow.com/questions/8094156/…
Dave

48

Bu hata, desteklenmeyen ilişki kullandığınızı veya eşlemenizde hata olduğunu belirtir. Kodunuz büyük olasılıkla hatayla kesinlikle ilgisizdir.

Hata, bağımlı varlıktaki yabancı anahtar özelliğinin depo oluşturulmuş olarak tanımlandığı varlıklar arasında bazı ilişkiniz olduğu anlamına gelir. Mağaza üretilen özellikler veritabanına doldurulur. EF, depolanan özellikleri yabancı anahtarlar olarak (birincil anahtarlarda hesaplanan özelliklerin yanı sıra) desteklemez.


2
aynı bilgi ile sql server'da satır ekleyebilirim. Store Generated dediğinizde bir örnek verebilir misiniz?
Galler Kralı

1
EF, SQL Server değildir. Kendi sınırlaması vardır. DB tarafından üretilen herhangi bir FK özelliğini nerede kullandığınızı bulun PaymentIDve onunla ilgilenin.
Ladislav Mrnka

tamam bir yabancı anahtar olarak paymentId içeren bir ödeme tablosu var, oraya bir satır eklemem gerekiyor mu?
Galler Kralı

Bu, satır eklemekle ilgili değil, sütunun tanımıyla ilgilidir. Bu sütunu nasıl ayarlıyorsunuz?
Ladislav Mrnka

görsel stüdyodaki ilişki modeline tıklandım ve 'Ödeme' ismini alıyorum 'Ödeme' tipinde kullanılamaz. üye adları, kapsayıcı türleriyle aynı olamaz. Herhangi bir fikir
Welsh King

8

Ben de aynı sorunu yaşadım. Burada verilen cevaplara dayanarak onu izleyip çözebildim, ancak aşağıda açıklanan garip bir sorunla karşılaştım - gelecekte birine yardımcı olabilir.

Bağımlı tablolarımda, yabancı Anahtar sütunları StoreGeneratedPattern = "Kimlik" olarak ayarlandı. "Yok" olarak değiştirmem gerekti. Ne yazık ki, bunu içeride yapmak tasarımcı hiç işe yaramadı.

Tasarımcı tarafından oluşturulan XML'e (SSDL) baktım ve bu özellikler hala oradaydı, bu yüzden onları manuel olarak kaldırdım. Ayrıca veritabanındaki sütunları düzeltmek zorunda kaldım (CREATE TABLE SQL'den Identity'yi (1,1) kaldırın)

Bundan sonra sorun ortadan kalktı.


Bu ipucu için teşekkürler. Tasarımcıdaki alanı Kimlik'ten Yok olarak değiştirmek, bunu EDMX'te bir yerde değiştirdi, ancak diğer yerde değiştirmedi, bu nedenle EDMX dosyasını kendim düzenleyene kadar hatayı hala alıyorum. Ne yazık ki EntityFramework çıldırdı ve ilgili varlıkları diğer tablolara yeniden eklemeye çalıştı, ancak yine de bu hata mesajını atlamak için yardımcı oldu.
FTWinston

6

Aynı sorunu yaşadım ve sql sunucusunda tablo tasarımında biraz araştırma yaptıktan sonra yanlışlıkla tablonun birincil anahtarını da yabancı anahtar olarak ayarladığımı fark ettim.

sql sunucu tablosu tasarım akışı

Bu görüntüde JobID'nin tablonun birincil anahtarı olduğunu ancak aynı zamanda yanlışlıkla yabancı anahtarı olduğunu görebilirsiniz.


2

Sorunum, yapılandırmada Birincil anahtarın yedekli tanımlanmasından kaynaklandı.

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

Bu satırı kaldır

.HasDatabaseGeneratedOption (DatabaseGeneratedOption.Identity)


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

Bu ilişkiyi tanımlamak için yeterli

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

Ödeme ile diğer tablolar / varlıklar arasındaki ilişkiyi yeniden kontrol edin. PaymentId içermemesi gerekenler dahil, çünkü sorun büyük olasılıkla burada saklanıyor.

SQL Server Management Studio'da yabancı anahtarlar oluştururken, birincil anahtar varsayılan değerdir ve bu varsayılan, ana tablo değiştirildiğinde geri alınır, bu nedenle "Tablolar ve Sütunlar" penceresinde değerleri doğru sırada değiştirmeye dikkat edin.

Ayrıca, sorunlu ilişkiyi düzelttikten sonra, modeldeki basit bir "Yenileme" nin modeldeki hatalı ilişkiyi doğru bir şekilde kaldırmaması ve " düzeltme " işleminden sonra bile aynı hatayı almanın büyük bir şansı vardır bu nedenle, yenileme yapmadan önce bunu modelde kendiniz yapın. (Ben bunu zor yoldan buldum.)


1

İlişkilerinizi kontrol ettiyseniz ve orada iyiyseniz.

Edmx'teki tabloyu silin ve ardından veritabanından güncelleyin. Bu, güncellemeyi manuel olarak yapmaktan kurtaracaktır.


Tavsiyeniz için gerçekten teşekkür ederim, veritabanımı doğrulamak için 1 saat harcadım, ancak kaldırıldıktan ve güncellendikten sonra her şey yolunda.
Tấn Nguyenên

1

Benim için masaya yanlış yerleştirilmiş bir yabancı anahtardı, ancak düzeltmek için tabloyu değiştirdikten sonra bile hala çalışmıyordu. EDMX dosyalarını güncellemeniz gerekir (ve tabloyu modelden "yenilemek" için yeterli değilse, tabloyu modelden kaldırmanız ve yeniden eklemeniz gerekir).


1

Kabul edilen cevaba ek olarak, EF Reverse POCO generator veya POCO'larınızı oluşturan başka bir araç kullanıyorsanız, onları yeniden oluşturduğunuzdan emin olun !


Harici DB-ilk EF modeli oluşturucunuzu değiştirdikten sonra (bağlamları tutarak) Özel T4 Aracınızı (POCO'ları tutarak) asla yeniden çalıştırmayı asla unutmayın ... HİÇ! XD (delirmiş de olabilirdi -.- ')
Shockwaver

0

Benim durumumda sorun, iki yönlü 1-1 ilişkisine sahip olmasından kaynaklanıyordu:

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

İki yabancı anahtardan birini çıkarmak zorunda kaldım (zaten gerekli değil).


0

Benim durumumda, veritabanında doğru şekilde ayarlanmış izinlere sahip değildim. Salt okunur küme vardı ve Entity çerçevesi bana bir ReferentialConstraint hatası veriyordu ve bu da beni attı. Ek yazma izinleri eklendi ve her şey yolunda gitti.


0

Benim durumumda, bir Veritabanı Oluşturulan özelliğim ve 1'e 1 ilgili tabloya başvurmak için bir ForeignKey gezinme özelliği ayarladım.

Bu kaldırabileceğim bir şey değildi, hem varlığın birincil anahtarını Veritabanı Oluşturulacak şekilde ayarlayabilmem ve hem de 1'e 1 tabloya bir gezinme özelliği olarak başvurabilmem gerekiyordu.

Bunun diğerleri için de aynı olup olmadığından emin değilim, ancak bu sorun yalnızca yeni bir varlık oluştururken ortaya çıkıyordu, mevcut varlıkları okumak veya düzenlemek sorunu sergilemiyordu, bu yüzden Bağlamımın devralınan bir sürümünü oluşturarak ve kullanarak sorunu çözdüm Oluşturma sırasında navigasyon özelliğini kapatmak için Fluent yöntemi.

Yani, orijinal varlığım şuna benziyordu:

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


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

Bu yüzden şuna benzeyen özel bir miras alınan bağlam oluşturdum:

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

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

        }
    }

ve sonra yeni varlığı oluşturan kodu yeni bağlam türünün kullanıcısı yapmak için değiştirdi

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

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

Umarım bu birine yardımcı olur


0

Benim durumumda, sadece Varlık Çerçevesinde FK olan Kimlik alanı "StoreGeneratedPattern" özelliği "Yok" yerine "Itentity" olarak ayarlandı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.