Зависимое свойство в ссылочной привязке сопоставляется с столбцом, созданным магазином

Я получаю эту ошибку при записи в базу данных:

Зависимое свойство в ссылочной привязке отображается на созданный магазином столбец. Столбец: "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;
    }

Схема:

enter image description here

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

После этого проблема исчезла.

Ответ 4

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

sql server table design flow

На этом рисунке вы можете видеть, что JobID является первичным ключом таблицы, но также и ошибочным внешним ключом.

Ответ 5

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

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

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

Ответ 6

Если вы проверили свои отношения и там хорошо.

Удалить таблицу в edmx, а затем обновить из базы данных. Это позволит вам сохранить обновление вручную.

Ответ 7

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

Ответ 8

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

Ответ 9

Моя проблема была вызвана избыточным определением первичного ключа в конфигурации.

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

Ответ 10

В моем случае проблема была вызвана двунаправленной зависимостью 1-1:

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

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

Ответ 11

В моем случае просто было, что у меня не было прав, установленных в базе данных. Я только что прочитал, и инфраструктура Entity дала мне ошибку ReferentialConstraint, которая отбросила меня. Добавлены дополнительные права на запись, и все было хорошо.

Ответ 12

В моем случае у меня было свойство Database Generated, а свойство navigationInsideKey, настроенное для ссылки на таблицу с 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();
    }

Надеюсь, что это поможет кому-то.

Ответ 13

В моем случае поле Id с FK только в Entity Framework для свойства "StoreGeneratedPattern" было установлено "Itentity" вместо "None"