Проблема с вставкой базы данных

#.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.

Я надеюсь, что это имеет смысл для тех, у кого похожие проблемы.

Спасибо,

Алекс Барак