#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:
Вы пытаетесь вставить неверное значение первичного ключа справочной таблицы, которое не представлено в базе данных.