LINQ-SQL + One-Many + удаление DataBinding

Пожалуйста, попробуйте ниже макет:

<?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>
9
задан Brian Tompsett - 汤莱恩 1 July 2015 в 08:29
поделиться

7 ответов

        try
        {
            // Needed for existing records, but will fail for new records
            yourLINQDataContext.Ingredients.DeleteOnSubmit(ingredient);
        }
        catch (Exception)
        {
            // Swallow
        }

        yourRecipeObject.Ingredients.Remove(ingredient);
7
ответ дан 3 November 2019 в 00:05
поделиться

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

Мне также было бы любопытно знать, имеют ли Ваши объекты идентификаторы автонумерации или если Вы используете некоторый другой идентификационный механизм. Вы, вероятно, отправляете, УДАЛЯЕТ к базе данных для пока еще незафиксированных записей Компонента, если они включают ПУСТЫЕ идентификаторы, я думаю, что linq мог бы стать противным.

Вы подняли трубку автора учебника к своему DataContext.Log для наблюдения, какие виды SQL сгенерирован непосредственно перед тем, как Вы получаете свой exeception?

0
ответ дан 3 November 2019 в 00:05
поделиться

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

На другой ноте: Вы довольно корректны, что чеснок может принадлежать многим рецептам (не думали, мои coctail рецепты!). Я на самом деле модель это со Статьей, object/table. Но для рецепта, Вам нужны количества. Таким образом в моей модели, у Вас есть Рецепт, который имеет 1:n Компоненты, каждый из них имеющий Количество, 1:1 связывается со Статьей (который имеет Имя, AlcoholContent и некоторые данные для установления иерархии взаимозаменяемости) и 1:1 связываются с Единицей (чтобы количество имело смысл). Так в некотором смысле таблица Ingredient делает отношения M:N между Рецептом и Статьей, и в то же время добавляя некоторую дополнительную информацию к каждому человеку связанная пара.

0
ответ дан 3 November 2019 в 00:05
поделиться

Кажется поиском чего-то, что я искал сам всего несколько дней назад, когда я спросил, "Как я разрабатываю отступающие типы данных для связанного с данными диалогового окна WPF с хорошо/кнопки отмены?".

Ответ является интригующим сообщением от Paul Stovell, описывающего демонстрационный адаптер IEditable для Linq к Sql. Это позволит, Вы создать Ваше желаемое "Применяете/Отменяете" семантику обобщенным способом, полностью не отделяя себя от базовых ORm-сгенерированных классов до полного пользовательски записанного слоя.

Это - довольно гладкий прием, в целом, который по существу позволит Вам обойти проблемы, с которыми Вы боретесь прямо сейчас.:)

На другой ноте мне любопытно относительно того, почему Ваш рецепт к отношениям компонента 1:n вместо m:n. Это для пользы простоты? Я использую чеснок в большом количестве рецептов.:)

3
ответ дан 3 November 2019 в 00:05
поделиться

У меня была точно та же проблема. У меня был родитель / дочерняя иерархия, и при добавлении и удалении дочернего объекта, не сохраняя к базе данных, я получил "Попытку, был сделан удалить отношения" исключение.

Я обнаружил, что эта проблема только возникла, когда я установил свойство стиля объекта ребенка к другому 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 хорошо работает с точки зрения сохранения, он только вызывает проблему, если новый объект удален перед сохранением.

0
ответ дан 3 November 2019 в 00:05
поделиться

Я сталкиваюсь с подобной проблемой как обходное решение, я должен назвать DataContext. GetChanges (), затем все, кажется, завоевало популярность снова :)

Другая проблема у Вас мог быть он, что Вы связываете со столбцами и не свойствами объекта и следовательно справочными наборами, не обновляется (уже указанный кем-то еще, но осуществлением факта).

0
ответ дан 3 November 2019 в 00:05
поделиться
// 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

2
ответ дан 3 November 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: