Модель не обновляется новыми значениями - PullRequest
0 голосов
/ 30 октября 2018

У меня проблема с моделью пользователя, которая не обновляется с правильным идентификатором ParentAccount после изменения значения во время работы приложения.

Например

Я буду запускать приложение и менять контакты родительского аккаунта. Затем создайте заказ и используйте метод «Создать» ниже, чтобы назначить родительский счет для заказа.

Теперь я чувствую, что он должен запустить метод "GetUser", который обновил модель currentuser, а затем взял текущего пользователя и назначил его продавцу.

Вместо этого он как бы пропускает его и сначала запускает код под ним и никогда не обновляет его с правильным идентификатором родительской учетной записи.

У кого-нибудь есть предложения по поводу того, почему это произойдет?

Спасибо!

public void Create(CrmContextCore _crmContext, Guid productId, ClaimsPrincipal User)
{
    // User Model 
    UserEntityModel currentuser;

    DAL_UserEntity UserData = new DAL_UserEntity();


    var EmailAddress = User.Claims.FirstOrDefault(c => c.Type == System.Security.Claims.ClaimTypes.Email)?.Value;

    var salesorder = new Entity("salesorder");
    {
        // Go get the current user data from crm system

        currentuser = UserData.GetUser(_crmContext, EmailAddress);

        // ISSUE! If i change this value while the application is running and rerun the method it shows the old value of currentuser not the new one??

        salesorder["customerid"] = new EntityReference("account", currentuser.ParentAccount.Id);
        salesorder["contactid"] = new EntityReference("contact", currentuser.ContactId);
        salesorder["emailaddress"] = currentuser.Email;
        salesorder["name"] = "PO123";
    }

    _crmContext.ServiceContext.AddObject(salesorder);

    _crmContext.ServiceContext.SaveChanges();
}

Вот модель пользователя

public class UserEntityModel
{

    public Guid ContactId {get; set;}
    public EntityReference ParentAccount { get; set; }
    public Guid Account {get; set;}
    public string FirstName {get; set;}
    public string LastName {get; set;}
    public string Email {get; set;}

}

Здесь создается модель пользователя

public class DAL_UserEntity
{
public UserEntityModel GetUser(CrmContextCore _crmContext, string email)
{

    Console.WriteLine("GetUser Method is Running!!");

    var user = (from u in _crmContext.ServiceContext.CreateQuery("contact")
                where u.GetAttributeValue<string>("emailaddress1") == email
                select u).Single();

    UserEntityModel ctx = new UserEntityModel();

    ctx.FirstName = user.GetAttributeValue<string>("firstname");
    ctx.LastName = user.GetAttributeValue<string>("lastname");
    ctx.Email = user.GetAttributeValue<string>("emailaddress1");
    ctx.ContactId = user.GetAttributeValue<Guid>("contactid");
    ctx.ParentAccount = user.GetAttributeValue<EntityReference>("parentcustomerid");

    return ctx;

}
}

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Вы создаете новую сущность и присваиваете значения из сущности, которую вы извлекли из БД. Если вы хотите обновить сущность БД, вам необходимо обновить поля в сущности БД, или вы можете присоединить новую сущность к контексту данных. См. Этот пост Зачем использовать Attach для обновления Entity Framework 6?

0 голосов
/ 31 октября 2018

Вероятно, потому что вы повторно используете объект CrmContextCore между обоими вызовами. Когда вы в первый раз называете ее, запись пользователя добавляется и отслеживается контекстом, а затем последующие вызовы фактически не повторяют запрос CRM, вместо этого возвращая старые данные из отслеживаемого объекта.

Это та же проблема, хотя и в другом сценарии, что и в этом вопросе Получение странного поведения при получении данных из Microsoft CRM с использованием LINQ

0 голосов
/ 30 октября 2018

Не видя определения модели, я могу только ответить на него следующим образом и связанного с Entity Framework:

Если вам нужно, чтобы обновленное / новое значение идентификатора было возвращено из чего-то вроде поля автоинкремента в таблице базы данных, в которую отображается модель, то украсьте поле модели с помощью:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

Это позволит получить новое значение ID после того, как модель получит сигнал обновления / создания от EF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...