Залежне властивість у ReferentialConstraint відображається у стовпці, створеному магазином


98

Я отримую цю помилку при записі в базу даних:

Залежне властивість у ReferentialConstraint відображається у стовпці, створеному магазином. Стовпець: "Ідентифікатор платежу".

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

Чи можливо, що ви визначили поганий зв'язок стовпців між вашими таблицями? різні стовпці, а один був встановлений як автонумераційний.

Це сталося зі мною.


55
Я помилково зробив один із моїх зовнішніх ключів ідентифікаційним (автоматичне збільшення). Це помилка, яку я отримав.
jocull

3
Дох! Я залишив частину відносин із зовнішнім ключем за замовчуванням, задану SQL Server 2008 Management Studio, яка була первинними полями дочірньої таблиці, а не стовпцем, який я створив, щоб містити значення зовнішнього ключа.
robaker 05.03.12

12
Якщо ви перевірите виняток у вікні швидкого перегляду (тобто (e as System.Data.Entity.Infrastructure.DbUpdateException).Entries), ви зможете побачити, яка таблиця містить первинний ключ, на який посилається.
Cᴏʀʏ

17
Чи не було б круто, якби повідомлення про помилки EF просто вказували, в чому проблема, замість того, щоб виплюнути gobbledy-gook?
AR

Я використовував цей запит, щоб переглянути всі відносини в одному режимі stackoverflow.com/questions/8094156/…
Дейв

47

Ця помилка говорить про те, що ви використовуєте непідтримуване відношення або у вас є помилка у зіставленні. Ваш код, швидше за все, абсолютно не пов’язаний з помилкою.

Помилка означає, що у вас є якесь відношення між сутностями, де властивість зовнішнього ключа в залежній сутності визначається як створене сховищем. Зроблені в магазині властивості заповнюються в базі даних. EF не підтримує збережені створені властивості як сторонні ключі (а також обчислювані властивості в первинних ключах).


2
я можу додати рядок на сервері sql з тією ж інформацією. коли ти кажеш, що Store Generated, чи можна навести приклад?
король

1
EF не є SQL Server. Це має своє обмеження. Просто знайдіть, де ви використовуєте будь-яке властивість FK, породжене FK, що називається, PaymentIDі мати справу з ним.
Ладислав Мрнка

Гаразд, у нас є таблиця історії платежів, в якій платіжний ідентифікатор є зовнішнім ключем, чи потрібно додати туди рядок?
Валлійський король

Йдеться не про додавання рядка, а про визначення стовпця. Як встановити цей стовпець?
Ladislav Mrnka

просто натиснув модель взаємозв'язку у візуальній студії, і ім'я "Оплата" не може бути використано у вигляді "Оплата" імена членів не можуть бути такими ж, як їх тип, що додається. Будь-які ідеї
король

8

У мене була така ж проблема. На основі наданих тут відповідей я зміг це відстежити та вирішити, але у мене виникла дивна проблема, описана нижче - це може допомогти комусь у майбутньому.

На моїх залежних таблицях для стовпців зовнішнього ключа встановлено StoreGeneratedPattern = "Identity". Мені довелося змінити його на "Ніхто". На жаль, зробити це всередині дизайнера взагалі не вийшло.

Я заглянув у XML (SSDL), створений дизайнером, і ці властивості все ще були там, тому я видалив їх вручну. Мені також довелося виправити стовпці в базі даних (видалити Identity (1,1) із CREATE TABLE SQL)

Після цього проблема пішла.


Дякую за цю пораду. Зміна поля в конструкторі з Identity на None змінила це в одному місці в EDMX, але не в іншому, тому я все-таки отримав помилку, поки сам не відредагував файл EDMX. На жаль, EntityFramework тоді збожеволів і спробував повторно вставити пов’язані сутності в інші таблиці, але все-таки це допомогло обійти це повідомлення про помилку.
FTWinston

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

Перевірте взаємозв'язок між платежем та іншими таблицями / організаціями. Включаючи ті, які не повинні містити PaymentId, оскільки саме там, швидше за все, криється проблема.

Під час створення зовнішніх ключів у SQL Server Management Studio за замовчуванням використовується первинний ключ, і це значення за замовчуванням повертається при зміні батьківської таблиці, тому будьте обережні, змінюючи значення у правильному порядку у вікні "Таблиці та стовпці".

Крім того, після виправлення проблемних відносин є хороший шанс, що просте "Оновити" на моделі не буде правильно видалити помилкові відносини з моделі, і ви отримаєте ту ж помилку навіть після " виправлення ", тому зробіть це самостійно в моделі перед тим, як виконати оновлення. (Я виявив це важким шляхом.)


1

Якщо ви перевірили ваші стосунки і вам там добре.

Видаліть таблицю в edmx, а потім оновіть її з бази даних. Це дозволить вам заощадити робити оновлення вручну.


Дуже дякую за вашу пораду, я витратив 1 годину, щоб перевірити свою базу даних, але після вилучення та оновлення все нормально.
Tấn Nguyên

1

Для мене це був неправильно розміщений зовнішній ключ у таблиці, але навіть після зміни таблиці для його виправлення він все ще не працював. Вам потрібно оновити файли EDMX (і недостатньо, щоб "оновити" таблицю з моделі, потрібно видалити та додати таблицю знову в моделі).


1

На додаток до прийнятої відповіді, якщо ви використовуєте генератор EF Reverse POCO або інший інструмент, який генерує ваші POCO, переконайтеся, що ви їх регенеруєте !


Ніколи не забувайте повторно запускати свій власний інструмент T4 (утримуючи POCO) після модифікації вашого зовнішнього генератора моделі EF першого типу DB (утримуючи контексти) ... КОЛИ-небудь! XD (міг також зійти з розуму -.- ')
Shockwaver

0

У моєму випадку проблема була викликана двостороннім співвідношенням 1-1:

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

Мені довелося просто видалити один із двох зовнішніх ключів (і так не потрібно).


0

У моєму випадку просто не було належних установлених дозволів у базі даних. Я читав лише набір і Entity Framework давав мені помилку ReferentialConstraint, яка мене відкинула. Додано додаткові дозволи на запис, і все було добре.


0

У моєму випадку у мене було властивість Database Generated та властивість навігації ForeignKey, налаштоване для посилання на пов'язану таблицю 1 до 1.

Це було не те, що я міг видалити, мені потрібно було як встановити первинний ключ сутності для створення бази даних, І мені потрібно було мати посилання на таблицю 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 просто в Entity Framework, властивість "StoreGeneratedPattern" була встановлена ​​"Itentity" замість "None"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.