Зависимое свойство в 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

Возможно ли, что вы определили неправильную связь столбцов между своими таблицами? разные столбцы, и один был настроен как автономный.

Это случилось со мной.

ju4nj3
источник
55
Я по ошибке сделал один из своих внешних ключей идентификатором (автоинкремент). Это ошибка, которую я получил.
jocull 09
3
Дох! Я оставил часть отношения внешнего ключа по умолчанию, заданную SQL Server 2008 Management Studio, которая была полями первичного ключа дочерней таблицы, а не столбцом, который я создал для хранения значения внешнего ключа.
robaker 05
12
Если вы проверите исключение в окне Quick Watch (т.е. (e as System.Data.Entity.Infrastructure.DbUpdateException).Entries), вы можете увидеть, какая таблица содержит первичный ключ, на который ссылаются.
Cᴏʀʏ
17
Разве не было бы здорово, если бы сообщения об ошибках EF просто указывали, в чем проблема, вместо того, чтобы выплевывать чепуху?
AR
Я использовал этот запрос, чтобы просмотреть все отношения в одном представлении stackoverflow.com/questions/8094156/…
Дэйв
47

Эта ошибка говорит о том, что вы используете неподдерживаемое отношение или имеете ошибку в отображении. Ваш код, скорее всего, абсолютно не связан с ошибкой.

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

Ладислав Мрнка
источник
2
Я могу добавить строку на сервере sql с той же информацией. когда вы говорите Store Generated, можете ли вы привести пример?
Welsh King
1
EF - это не SQL Server. У него есть свои ограничения. Просто найдите, где вы используете любое вызванное свойство FK, созданное БД, PaymentIDи разберитесь с ним.
Ладислав Мрнка
Хорошо, у нас есть таблица paymenthistory, в которой в качестве внешнего ключа указан paymentId, мне нужно добавить туда строку?
Welsh King
Речь идет не о добавлении строки, а об определении столбца. Как установить этот столбец?
Ladislav Mrnka
просто щелкнул модель отношений в визуальной студии, и я получаю имя «Оплата», которое нельзя использовать в типе «Оплата». имена членов не могут совпадать с их включающим типом. Любые идеи
Welsh King
8

У меня такая же проблема. Основываясь на приведенных здесь ответах, я смог отследить и решить эту проблему, но у меня возникла странная проблема, описанная ниже - она ​​может кому-то помочь в будущем.

В моих зависимых таблицах столбцы внешнего ключа были установлены на StoreGeneratedPattern = "Identity". Пришлось поменять на «Нет». К сожалению, внутри дизайнера это вообще не сработало.

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

После этого проблема ушла.

серфить
источник
Спасибо за этот совет. Изменение поля в дизайнере с Identity на None изменило это в одном месте EDMX, но не в другом, поэтому я все еще получал ошибку, пока сам не редактировал файл EDMX. К сожалению, EntityFramework затем сошел с ума и попытался повторно вставить связанные сущности в другие таблицы, но, тем не менее, это помогло обойти это сообщение об ошибке.
FTWinston
6

У меня была такая же проблема, и после некоторого покопания в дизайне таблиц на сервере sql я обнаружил, что по ошибке я установил первичный ключ таблицы также как внешний ключ.

Процесс создания таблицы sql server

На этом изображении вы можете видеть, что 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, а затем обновите из базы данных. Это избавит вас от необходимости выполнять обновление вручную.

rickjr82
источник
На самом деле спасибо за ваш совет, я потратил 1 час на проверку своей базы данных, но после удаления и обновления все в порядке.
Tn Nguyên
1

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

knocte
источник
1

В дополнение к принятому ответу, если вы используете генератор EF Reverse POCO или какой-либо другой инструмент, который генерирует ваши POCO, убедитесь, что вы их регенерируете !

adam0101
источник
Никогда не забывайте повторно запускать свой Custom T4 Tool (содержащий 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.

Это не было чем-то, что я мог удалить, мне нужно было установить первичный ключ объекта как Database Generated И мне нужно было иметь возможность ссылаться на таблицу 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

В моем случае поле Id, которое FK только в Entity Framework, свойство StoreGeneratedPattern было установлено «Itentity» вместо «None»

Лев К.
источник