#.net #frameworks #insert #entity
#.net #фреймворки #вставить #сущность
Вопрос:
У меня есть эта ошибка в моем приложении, которую я понятия не имею, как исправить.
У меня есть 5 таблиц:
Customer
Branch
PointOfSale
User
CustomerEndUser
которые имеют следующие отношения :
Customer->Branch one-to-many
Branch->PointOfSale one-to-many
Customer->CustomerEndUser one-to-many
User->CustomerEndUser one-to-one
PointOfSale->CustomerEndUser one-to-many
Я использую ADO.NET Entity Framework для выполнения транзакций с базой данных.
Когда я хочу добавить нового CustomerEndUser, я должен указать ему PointOfSale, пользователя и клиента. Но каждый раз, когда я вызываю метод Insert для CustomerEndUser, метод выдает исключение: «Сущности в idenTTsystemEntities.PointOfSaleSet’ участвует в отношениях ‘FK_PointsOfSale_Branches’. найдено 0 связанных «ветвей». ожидается 1 «ветвление».Администратор сайта будет уведомлен. Пожалуйста, повторите попытку позже. «, хотя я предоставляю CustomerEndUser необходимую информацию.
Вот код, который я использую в своем методе вставки :
public static CustomerEndUser InsertIntUser(CustomerEndUser endUser)
{
idenTTsystemEntities context = new idenTTsystemEntities();
var mbr = Membership.Providers[INTMembershipProviderName];
MembershipCreateStatus userStatus;
if(mbr==null)
{
throw new NullReferenceException("Membership Provider is null");
}
MembershipUser mbrUser = mbr.CreateUser(endUser.Username, endUser.Password, endUser.Email, "no question",
"no answer", true, Guid.NewGuid(),
out userStatus);
if(userStatus==MembershipCreateStatus.Success)
{
ProfileBase profileBase = ProfileBase.Create(endUser.Username);
SettingsPropertyValueCollection profileProperties =
profileBase.Providers[INTProfileProviderName].GetPropertyValues(profileBase.Context,
ProfileBase.Properties);
//add the firstname, lastname and dateofbirth properties
profileProperties["FirstName"].PropertyValue = endUser.FirstName;
profileProperties["LastName"].PropertyValue = endUser.LastName;
var shortDate = new System.Globalization.DateTimeFormatInfo();
shortDate.ShortDatePattern = "dd.MM.yyyy";
profileProperties["DateOfBirth"].PropertyValue = Convert.ToDateTime(endUser.BirthDate, shortDate);
//get the id of the newly created end user
Guid newUserId = (Guid)mbrUser.ProviderUserKey;
//add the user to the CustomerEndUser
User newUser = context.UserSet.Where(u => u.UserId == newUserId).First();
endUser.User = newUser;
//get the customer to which the end user belongs to
Customer cust = context.CustomerSet.Where(c => c.CustomerId == CustomerId).First();
endUser.Customer = cust;
//get the pos selected in the insertform
Guid posId = endUser.PosId;
PointOfSale selectedPos = context.PointOfSaleSet.Include("Branch").Where(br => br.PointOfSaleId == posId).First();
endUser.PointOfSale = selectedPos;
endUser.EndUserId = Guid.NewGuid();
context.AddToCustomerEndUsers(endUser);
profileProperties["Language"].PropertyValue = "de-DE";
profileBase.Providers[INTProfileProviderName].SetPropertyValues(profileBase.Context, profileProperties);
profileBase.Save();
context.SaveChanges();
return endUser;
}
throw new MembershipCreateUserException(userStatus);
}
Google говорит, что это можно исправить с помощью хранимой процедуры, но я бы хотел другое решение, если это возможно. Спасибо!
Приветствия, Алекс Барак
Ответ №1:
Вы должны заметить, что PointsOfSale
они должны быть связаны как минимум с 1 Branch
. То же самое для Customer
, это также должно быть связано с Branch
.
Таким образом, решение заключается в том, что когда вы загружаете PointsOfSale, вы также должны загрузить его связанную ветку.(То же самое для клиента). Вы знаете, как это сделать, верно?
Комментарии:
1. ‘.Include («Branch»)’ в определении ‘selectedPos’ делает именно это. Когда я проверяю содержимое ‘selectedPos’, внутри него есть ветвь, но выдается то же исключение. Я не уверен, что исключение связано с клиентом или нет.
Ответ №2:
Проблема была решена, и она не была связана с методом вставки. Каждый раз, когда я хотел создать нового конечного пользователя, внутри его конструктора я также создавал новый PointOfSale и прикреплял его к конечному пользователю, поэтому EntityFramework посчитал, что я также вставляю PointOfSale, и ожидал ветку, хотя я ее и предоставил. Вместо создания нового объекта внутри конструктора используйте его ссылку.Загружается и ссылается.Свойства EntityKey, созданные EntityFramework.
Я надеюсь, что это имеет смысл для тех, у кого похожие проблемы.
Спасибо,
Алекс Барак