Проблема с вставкой базы данных - PullRequest
1 голос
/ 20 октября 2011

У меня есть эта ошибка в моем приложении, которую я не знаю, как исправить.

У меня есть 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 связанных« Branches ». 1 Ожидается« Branches ». Ожидается сайт)администратор будет уведомлен. Пожалуйста, попробуйте позже. ", хотя я предоставляю 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 говоритэто можно исправить с помощью хранимой процедуры, но я бы хотел другое решение, если это возможно.Спасибо!

Ура, Алекс Барак

Ответы [ 2 ]

0 голосов
/ 21 октября 2011

Проблема была решена, и она не была связана с методом вставки.Каждый раз, когда я хотел создать нового EndUser, внутри его конструктора я также создавал новый PointOfSale и присоединял его к EndUser, поэтому EntityFramework рассмотрел, что я также вставляю PointOfSale, и ожидал Branch, хотя я его и предоставил.Вместо создания нового объекта внутри конструктора используйте его свойства Reference.IsLoaded и Reference.EntityKey, созданные EntityFramework.

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

Спасибо,

Алекс Барак

0 голосов
/ 20 октября 2011

U следует заметить, что PointsOfSale должно относиться как минимум к 1 Branch.То же самое для Customer, оно также должно быть связано с Branch.

. Таким образом, решение заключается в том, что когда вы загружаете PointsOfSale, вы должны также загружать связанный с ним филиал (то же самое для клиента).Ты знаешь, как это сделать, верно?

...