Добавление ссылки на сущность, вызывающую исключение
У меня есть модель, как показано ниже (создана с использованием подхода Model-First).
Книга является предметом продажи. DigitalDisc является предметом продажи. Это работает нормально, и данные правильно вставляются в базу данных.
Я добавляю новый объект под названием "Покупка". Одна покупка содержит несколько продаваемых предметов. После того, как я добавил эту новую связь и обновил схему базы данных, я получаю следующее исключение.
Произошла ошибка при обновлении записей.
"Оператор INSERT вступил в конфликт с ограничением FOREIGN KEY \"FK_PurchaseSellingItem\". Конфликт произошел в базе данных \"LibraryReservationSystem\", таблице \"dbo.Purchases\", столбце 'PurchaseId'.\ R \ n Установка прекращена."}
Как это побороть?
Примечание. Мне нужно создать книгу (например, ввести данные книги в базу данных). Покупка может или не может произойти для этой книги. Когда книга создана, столбец внешнего ключа должен быть нулевым для этой книги. Но когда этот столбец обновляется, в таблице покупок должен присутствовать идентификатор. Это возможно?
Примечание. Когда я пытаюсь сделать поле "PurchasePurchaseId" обнуляемым в модели, я получаю следующую ошибку:
Ошибка 1 Ошибка 113: множественность недопустима в роли "Покупка" в отношении "Покупка SellingItem". Поскольку все свойства в зависимой роли обнуляются, кратность основной роли должна быть равна 0..1. C:\Documents and Settings\U16990\ Мои документы \Visual Studio 2010\Projects\LijosEF\LijosEF\MyModelFirstTest.edmx 35 3 LijosEF
КОД
class Program
{
static string connectionStringVal;
static void Main(string[] args)
{
SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
sqlBuilder.DataSource = ".";
sqlBuilder.InitialCatalog = "LibraryReservationSystem";
sqlBuilder.IntegratedSecurity = true;
// Initialize the EntityConnectionStringBuilder.
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
entityBuilder.Provider = "System.Data.SqlClient";
entityBuilder.ProviderConnectionString = sqlBuilder.ToString();
entityBuilder.Metadata = @"res://*/MyModelFirstTest.csdl|res://*/MyModelFirstTest.ssdl|res://*/MyModelFirstTest.msl";
connectionStringVal = entityBuilder.ToString();
AddBook();
AddDisc();
}
private static void AddBook()
{
//string connectionstring = "Data Source=.;Initial Catalog=SalesDB;Integrated Security=True;Connect Timeout=30";
using (var db = new MyModelFirstTestContainer(connectionStringVal))
{
Book book = new Book();
book.AvailabilityStatus = "Available";
book.Price = 150;
book.Title = "Maths Easy";
db.SellingItems.AddObject(book);
db.SaveChanges();
}
}
private static void AddDisc()
{
//string connectionstring = "Data Source=.;Initial Catalog=SalesDB;Integrated Security=True;Connect Timeout=30";
using (var db = new MyModelFirstTestContainer(connectionStringVal))
{
DigitalDisc disc = new DigitalDisc();
disc.AvailabilityStatus = "Available";
disc.Price = 300;
disc.Artist = "Turtle Violin";
db.SellingItems.AddObject(disc);
db.SaveChanges();
}
}
}
ССЫЛКА:
1 ответ
Вы настроили обязательное отношение, но сохраняете SellingItem
без связи Purchase
, Я ожидаю, что EF выдаст какое-то исключение перед сохранением записей в базе данных, но этого не произошло, и, скорее всего, оно попытается передать значение по умолчанию для столбца FK, а у вас нет Purchase
с таким Id
,
Btw. не следует ли вместо этого использовать отношение "многие ко многим", потому что предмет продажи может быть продан несколько раз, а покупка может иметь несколько предметов?