Оператор INSERT конфликтовал с ограничением ВНЕШНЕГО КЛЮЧА в Entity Framework

#c# #asp.net-mvc #visual-studio #linq #entity-framework

#c# #asp.net-mvc #visual-studio #linq #entity-framework

Вопрос:

У меня есть две таблицы Subscription и packageType. Subs имеет FK в качестве PackageTypeId. Теперь, когда я вставляю новую запись в таблицу подписки, используя EF 4.1, она выдает исключение

Оператор INSERT конфликтовал с ограничением ВНЕШНЕГО КЛЮЧА "FK_Subscription_PaymentType" . Конфликт произошел в базе данных «MyDatabaseName», таблице "dbo.PaymentType" , столбце 'Id' . Оператор был завершен.

Информация таблиц:

Таблица подписки:

    Id  (PK)

   PaymentTypeId (FK)

   Period

   date 
  

PaymentType:

    Id (PK)

   Name
  

И код приведен ниже:

     public void Proceed(SubscriptionSessionData data)
    {

        if (data != null)
        {
            PMSCatalogEntities entities = new PMSCatalogEntities();

                Subscription subs = new Subscription();
                subs.Id = Guid.NewGuid();
                subs.ApplicableFrom = data.ApplicableFrom;
                subs.TenantId = tenant.Id;

                subs.PackageId = data.PaymentType;
                subs.PaymentTypeId = data.PaymentType;

                entities.AddToSubscriptions(subs);
                entities.SaveChanges();

        }
  }
  

Есть идеи по этому поводу?

Комментарии:

1. Пожалуйста, предоставьте код, который выполняет эту вставку

2. Как здесь связана таблица PaymentType, вам нужно добавить больше информации, на данный момент это не имеет смысла

3. Анкур и V4Vendetta Я добавил больше информации, связанной с кодом и моими таблицами.

4. Не связано с вашей проблемой, но вы должны удалить контекст, когда он вам больше не нужен, например using (var entities = new PMSCatalogEntities()) { /* your code */ }

5. Я предполагаю, что данные. PaymentType — это целое число? Откуда берется его значение? Я бы дважды проверил в отладчике, какое значение он содержит, затем запросил базовую таблицу и убедился, что строка с этим PK существует

Ответ №1:

Я уже тестировал этот сценарий, и он отлично работает:

     class Program
    {
        static void Main(string[] args)
        {
            PMSCatalogEntities entities = new PMSCatalogEntities();

            Subscription subs = new Subscription();
            subs.Id = Guid.NewGuid();
            subs.Date = DateTime.Now;
            subs.PaymentId = 1;

            entities.Subscriptions.Add(subs);
            entities.SaveChanges();
        }
    }

    public class PMSCatalogEntities : DbContext
    {
        public DbSet<Subscription> Subscriptions { get; set; }

        public DbSet<Payment> Payments { get; set; }

    }

    public class Subscription
    {
        public Guid Id { get; set; }

        public DateTime Date { get; set; }

        public Payment Payment { get; set; }

        public int PaymentId { get; set; }
    }

    public class Payment
    {
        public int Id { get; set; }

        public string Type { get; set; }
    }
  

И в БД

 TABLE [dbo].[Payments](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Type] [nvarchar](max) NULL,

TABLE [dbo].[Subscriptions](
    [Id] [uniqueidentifier] NOT NULL,
    [Date] [datetime] NOT NULL,
    [PaymentId] [int] NOT NULL,
  

Единственное, в чем я должен быть уверен, это в том, что платеж с идентификатором 1 для этого примера сохраняется в таблице платежей, и это работает как шарм!!

Ответ №2:

Я видел это недавно, когда связь использовала первичные ключи родительской и дочерней записи вместе, вместо первичного ключа и внешнего ключа. На диаграмме была подсказка для этого в том, что мощность была неправильной (1-> 0,1 вместо 1 -> *)

Ответ №3:

Вы уверены, что значение, которое вы присваиваете подразделам.PaymentTypeId (данные.PaymentType) является допустимым идентификатором из существующей записи в таблице PaymentType?

Комментарии:

1. Да, я дважды проверил в отладчике.

Ответ №4:

Вы пытаетесь вставить неверное значение первичного ключа справочной таблицы, которое не представлено в базе данных.