#c# #entity-framework #foreign-keys #try-catch #dbcontext
#c# #entity-framework #внешние ключи #попробуйте-catch #dbcontext
Вопрос:
у меня есть gridview
.это представление сетки содержит много записей (информация об элементе) .
try
{
Member member=new Member();
IdMember = int.Parse(gvListCompany.SelectedRows[0].Cells[0].Value.ToString());
member = objMemberRepository.FindBy(i => i.Id == IdMember).First();
objMemberRepository.Delete(member);
objMemberRepository.Save();
toolStripStatusLabelLine.Visible = true;
lblState.Text = "delete is successfully";
StatusMain.BackColor = Color.Green;
gvListCompany.DataSource = objMemberRepository.FindBy(i => i.IsSupporter == typeofmember).ToList();
}
catch
{
toolStripStatusLabelLine.Visible = true;
lblState.Text = "couldn't delete because of subset records";
StatusMain.BackColor = ColorTranslator.FromHtml("#ea0000");
return;
}
Вот код для удаления элемента представления таблицы . Предположим, я хочу удалить запись, которая имеет FK item
в другой таблице, поэтому записи не могут быть удалены, а оператор try выдает исключение, и я показываю соответствующее error
пользователю, как this record has an subset please delete the subset
после этой операции, если я попытаюсь удалить запись, которой нет FK
в другой таблице, я получу ту же ошибку, и я не могу ее удалить, но на самом деле я должен иметь возможность удалить, потому что в моей записи ее нет FK
записи в другой таблице .
Сообщение об ошибке
The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.
Класс-член:
public partial class Member
{
public Member()
{
this.Inovices = new HashSet<Inovice>();
}
public int Id { get; set; }
public string Type { get; set; }
public string Name { get; set;
public string EconomicCompnayNumber { get; set; }
public string IntNumber { get; set; }
public string Province { get; set; }
public string City { get; set; }
public string PostCode { get; set; }
public string Address { get; set; }
public string PhoneNumber { get; set; }
public string Region { get; set; }
public string IsSupporter { get; set; }
public virtual ICollection<Inovice> Inovices { get; set; }
public virtual ICollection<Cash> Cashes { get; set; }
}
Я изменил свой код на это, и это работает, но я действительно не знаю, почему?
MemberRepository aa = new MemberRepository();
Member member=new Member();
IdMember = int.Parse(gvListCompany.SelectedRows[0].Cells[0].Value.ToString());
Name = gvListCompany.SelectedRows[0].Cells[2].Value.ToString();
member = aa.FindBy(i => i.Id == IdMember).First();
try
{
aa.Delete(member);
aa.Save();
toolStripStatusLabelLine.Visible = true;
lblState.Text = "شرکت " Name " با موفقیت حذف شد ";
StatusMain.BackColor = Color.Green;
gvListCompany.DataSource = aa.FindBy(i => i.IsSupporter == typeofmember).ToList();
}
catch
{
toolStripStatusLabelLine.Visible = true;
lblState.Text = "برای '" Name "' در سیستم فاکتور ثبت شده است ";
StatusMain.BackColor = ColorTranslator.FromHtml("#ea0000");
return;
}
Я думаю, это из-за dbcontext .
С наилучшими пожеланиями
Комментарии:
1. Ваша попытка / перехват довольно усердны. ВСЕ, что пойдет не так внутри этого блока try, сообщит о сбое с «не удалось удалить из-за записей подмножества». Пусть генерируется исключение (внутри catch просто поместите «throw;» в строку), чтобы вы могли видеть, в чем заключается реальная проблема.
2. Не могли бы вы, пожалуйста, сказать мне, куда именно следует поместить оператор throw ?
3. Внутри блока catch{}. В идеале, ваш оператор try{} должен содержать только . Методы Delete() и .Save(), так что область действия вашего catch{} будет ограничена кодом, который вы на самом деле пытаетесь перехватить. catch { throw; // … } Похоже, что это не та проблема, с которой вы столкнулись на самом деле (на основе вашего обновления с фактической ошибкой), но я бы все равно рекомендовал это.
4. Я ввел метод сохранения и удаления в инструкцию try, но та же ошибка
5. Моя проблема решается путем вставки класса репозитория внутри try / catch , я имею в виду, что я создаю новый репозиторий, и это работает, но почему?? MemberRepository aa = новый MemberRepository();