Пожалуйста, попробуйте ниже макет:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/civ_user_avatar"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="16dp"
android:src="@color/primary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/civ_user_avatar" />
<TextView
android:id="@+id/tv_candidate_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginLeft="24dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:text="TextView"
app:layout_constraintEnd_toStartOf="@+id/tv_status"
app:layout_constraintStart_toEndOf="@+id/civ_user_avatar"
app:layout_constraintTop_toTopOf="@+id/civ_user_avatar" />
<TextView
android:id="@+id/tv_candidate_email"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:text="TextView"
android:textAppearance="@style/TextSecondary"
app:layout_constraintEnd_toStartOf="@+id/tv_status"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/tv_candidate_name"
app:layout_constraintTop_toBottomOf="@+id/tv_candidate_name" />
<TextView
android:id="@+id/textView7"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:maxLines="1"
android:text="Assessment : "
android:textColor="@color/black"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@+id/tv_candidate_name"
app:layout_constraintTop_toBottomOf="@+id/tv_candidate_email" />
<TextView
android:id="@+id/tv_assessment_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:text="TextView"
app:layout_constraintBottom_toBottomOf="@+id/textView7"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/textView7"
app:layout_constraintTop_toTopOf="@+id/textView7" />
</android.support.constraint.ConstraintLayout>
</layout>
try
{
// Needed for existing records, but will fail for new records
yourLINQDataContext.Ingredients.DeleteOnSubmit(ingredient);
}
catch (Exception)
{
// Swallow
}
yourRecipeObject.Ingredients.Remove(ingredient);
необходимо отделить код сохранения от событий в GUI, кажется, что Вы немного к нетерпеливому для сохранения вещей к дб, прежде чем пыль обосновалась, и Вы ставите в очередь и удаляете вещи из дб, который никогда не добирался там во-первых, будет лучше, если Вы могли бы определить точку, когда пользователь будет "фиксировать" их изменения, и в тот момент, обрабатывать полное условие GUI - это сохранит Вас набор запутанного кода.
Мне также было бы любопытно знать, имеют ли Ваши объекты идентификаторы автонумерации или если Вы используете некоторый другой идентификационный механизм. Вы, вероятно, отправляете, УДАЛЯЕТ к базе данных для пока еще незафиксированных записей Компонента, если они включают ПУСТЫЕ идентификаторы, я думаю, что linq мог бы стать противным.
Вы подняли трубку автора учебника к своему DataContext.Log для наблюдения, какие виды SQL сгенерирован непосредственно перед тем, как Вы получаете свой exeception?
Спасибо за Ваш ответ, я буду исследовать сообщения и видеть то, что я могу сделать. Я должен сказать, что удивлен даже видеть, что эта проблема происходит, для меня кажется довольно естественным, что можно было добавить записи на LINQ-обеспеченный "кэш" данных, затем решить стереть некоторые из них и затем фиксировать. Отслеживание изменений должно смочь обработать это. Я только запускающийся с LINQ, таким образом, я мог бы делать глупую ошибку где-нибудь в коде (не будет первым).
На другой ноте: Вы довольно корректны, что чеснок может принадлежать многим рецептам (не думали, мои coctail рецепты!). Я на самом деле модель это со Статьей, object/table. Но для рецепта, Вам нужны количества. Таким образом в моей модели, у Вас есть Рецепт, который имеет 1:n Компоненты, каждый из них имеющий Количество, 1:1 связывается со Статьей (который имеет Имя, AlcoholContent и некоторые данные для установления иерархии взаимозаменяемости) и 1:1 связываются с Единицей (чтобы количество имело смысл). Так в некотором смысле таблица Ingredient делает отношения M:N между Рецептом и Статьей, и в то же время добавляя некоторую дополнительную информацию к каждому человеку связанная пара.
Кажется поиском чего-то, что я искал сам всего несколько дней назад, когда я спросил, "Как я разрабатываю отступающие типы данных для связанного с данными диалогового окна WPF с хорошо/кнопки отмены?".
Ответ является интригующим сообщением от Paul Stovell, описывающего демонстрационный адаптер IEditable для Linq к Sql. Это позволит, Вы создать Ваше желаемое "Применяете/Отменяете" семантику обобщенным способом, полностью не отделяя себя от базовых ORm-сгенерированных классов до полного пользовательски записанного слоя.
Это - довольно гладкий прием, в целом, который по существу позволит Вам обойти проблемы, с которыми Вы боретесь прямо сейчас.:)
На другой ноте мне любопытно относительно того, почему Ваш рецепт к отношениям компонента 1:n вместо m:n. Это для пользы простоты? Я использую чеснок в большом количестве рецептов.:)
У меня была точно та же проблема. У меня был родитель / дочерняя иерархия, и при добавлении и удалении дочернего объекта, не сохраняя к базе данных, я получил "Попытку, был сделан удалить отношения" исключение.
Я обнаружил, что эта проблема только возникла, когда я установил свойство стиля объекта ребенка к другому linq-sql объекту перед сохранением. например,
1. Это создает ошибку
RetailAccountCustomerCard racc = new RetailAccountCustomerCard();
Card addedCard = _idc.Cards.Where(c => c.CardId == card.CardId).ToList().First();
racc.Card = addedCard;
this.CurrentCustomer.RetailAccountCardsBindingList.Add(racc);
// Some code triggered by the user before saving to the db
CurrentCustomer.RetailAccountCardsBindingList.Remove(racc);
2. Это не создает ошибку
RetailAccountCustomerCard racc = new RetailAccountCustomerCard();
racc.CardId = card.CardId; // note that I have set the Id property not the object
this.CurrentCustomer.RetailAccountCardsBindingList.Add(racc);
// Some code triggered by the user before saving to the db
CurrentCustomer.RetailAccountCardsBindingList.Remove(racc);
Странно достаточно, ошибка, которая возникает в 1. указывает, что проблема относится к отношениям, находится на свойстве RetailAccountCustomerId RetailAccountCustomerCard. IT Не имеет никакого отношения к объекту Карты, который я добавил. Кажется, что просто установка любого свойства объекта нового объекта инициировала проблему.
NB. Пример 1 хорошо работает с точки зрения сохранения, он только вызывает проблему, если новый объект удален перед сохранением.
Я сталкиваюсь с подобной проблемой как обходное решение, я должен назвать DataContext. GetChanges (), затем все, кажется, завоевало популярность снова :)
Другая проблема у Вас мог быть он, что Вы связываете со столбцами и не свойствами объекта и следовательно справочными наборами, не обновляется (уже указанный кем-то еще, но осуществлением факта).
// Create new entities
Cart c = new Cart();
CartEntry ce = new CartEntry();
ce.Cart = c;
// Delete the entry
c.CartEntries.Remove(ce);
dc.Cartentries.Attach(ce);
dc.CartEntries.DeleteOnSubmit(ce);
// Insert the cart into database
dc.Carts.InsertOnSubmit(c);
dc.SubmitChanges();
Объяснение проблемы: Обе сущности, c и ce, не связаны с контекстом данных - они не отслеживаются. EntitySet.Remove() (первая строка удаления) удаляет только связь между c и ce. В то время как c может существовать без связанных записей корзины, ce не может существовать без связанной корзины из-за ограничения внешнего ключа. При передаче изменений в базу данных отсоединенный ce также будет обработан, что вызовет нарушение ограничений и исключение.
Чтобы избавиться от этой неотслеживаемой и отсоединенной записи корзины, вам нужно присоединить ее к контексту данных (в результате чего она будет отслеживаться), а затем пометить ее для удаления при отправке. В момент отправки изменений запись корзины будет удалена правильно и не вызовет исключения.
Для получения более подробной информации по этому вопросу посмотрите здесь: http://msdn.microsoft.com/en-us/library/bb546187%28v=VS.100%29.aspx