Entity Framework Нет соответствующего столбца - PullRequest
0 голосов
/ 08 ноября 2019

Я боролся с этой проблемой некоторое время, я исправляю ее с одной машины, объединяюсь с GIT и тяну за другой (с идентичными базами данных), и ошибка возникает снова. Я не могу понять это для этого конкретного случая.

У меня есть хранимая процедура, которая возвращает следующее:

enter image description here

Когда я запускаю свой код и нажимаю на эту конечную точку, я получаю ошибку:

Устройство чтения данных несовместимо с указанным здесь моим комплексным типом . Элемент типа 'CUSTOMER_ID' не имеет соответствующего столбца в считывателе данных с тем же именем.

Я не понимаю, почему он не работает, у меня есть другие процедуры, которыеочень похоже, и все работает нормально. Мой сложный тип настроен как ADD_CUSTOMER_JSON_Result и является скалярным int32 с именем CUSTOMER_ID. Функциональный импорт для моей хранимой процедуры ADD_CUSTOMER_JSON настроен на этот сложный тип.

Контекст CS моей модели для этой хранимой процедуры:

public virtual ObjectResult<ADD_CUSTOMER_JSON_Result> ADD_CUSTOMER_JSON(Nullable<int> cOMPANY_ID, string cUSTOMER_NAME, string fIRST_NAME, string lAST_NAME, string aDDRESS_1, string aDDRESS_2, Nullable<int> cITY_ID, Nullable<int> sTATE_ID, Nullable<int> zIP_CODE_ID, string pRIMARY_PHONE_NUMBER, string aLTERNATE_PHONE_NUMBER, string sECONDARY_PHONE_NUMBER, string eMAIL_ADDRESS, string cUSTOMER_NOTES, string mODIFIED_BY, ObjectParameter cUSTOMER_ID)
{
    var cOMPANY_IDParameter = cOMPANY_ID.HasValue ?
                new ObjectParameter("COMPANY_ID", cOMPANY_ID) :
                new ObjectParameter("COMPANY_ID", typeof(int));

    var cUSTOMER_NAMEParameter = cUSTOMER_NAME != null ?
                new ObjectParameter("CUSTOMER_NAME", cUSTOMER_NAME) :
                new ObjectParameter("CUSTOMER_NAME", typeof(string));

    var fIRST_NAMEParameter = fIRST_NAME != null ?
                new ObjectParameter("FIRST_NAME", fIRST_NAME) :
                new ObjectParameter("FIRST_NAME", typeof(string));

    var lAST_NAMEParameter = lAST_NAME != null ?
                new ObjectParameter("LAST_NAME", lAST_NAME) :
                new ObjectParameter("LAST_NAME", typeof(string));

    var aDDRESS_1Parameter = aDDRESS_1 != null ?
                new ObjectParameter("ADDRESS_1", aDDRESS_1) :
                new ObjectParameter("ADDRESS_1", typeof(string));

    var aDDRESS_2Parameter = aDDRESS_2 != null ?
                new ObjectParameter("ADDRESS_2", aDDRESS_2) :
                new ObjectParameter("ADDRESS_2", typeof(string));

    var cITY_IDParameter = cITY_ID.HasValue ?
                new ObjectParameter("CITY_ID", cITY_ID) :
                new ObjectParameter("CITY_ID", typeof(int));

    var sTATE_IDParameter = sTATE_ID.HasValue ?
                new ObjectParameter("STATE_ID", sTATE_ID) :
                new ObjectParameter("STATE_ID", typeof(int));

    var zIP_CODE_IDParameter = zIP_CODE_ID.HasValue ?
                new ObjectParameter("ZIP_CODE_ID", zIP_CODE_ID) :
                new ObjectParameter("ZIP_CODE_ID", typeof(int));

    var pRIMARY_PHONE_NUMBERParameter = pRIMARY_PHONE_NUMBER != null ?
                new ObjectParameter("PRIMARY_PHONE_NUMBER", pRIMARY_PHONE_NUMBER) :
                new ObjectParameter("PRIMARY_PHONE_NUMBER", typeof(string));

    var aLTERNATE_PHONE_NUMBERParameter = aLTERNATE_PHONE_NUMBER != null ?
                new ObjectParameter("ALTERNATE_PHONE_NUMBER", aLTERNATE_PHONE_NUMBER) :
                new ObjectParameter("ALTERNATE_PHONE_NUMBER", typeof(string));

    var sECONDARY_PHONE_NUMBERParameter = sECONDARY_PHONE_NUMBER != null ?
                new ObjectParameter("SECONDARY_PHONE_NUMBER", sECONDARY_PHONE_NUMBER) :
                new ObjectParameter("SECONDARY_PHONE_NUMBER", typeof(string));

    var eMAIL_ADDRESSParameter = eMAIL_ADDRESS != null ?
                new ObjectParameter("EMAIL_ADDRESS", eMAIL_ADDRESS) :
                new ObjectParameter("EMAIL_ADDRESS", typeof(string));

    var cUSTOMER_NOTESParameter = cUSTOMER_NOTES != null ?
                new ObjectParameter("CUSTOMER_NOTES", cUSTOMER_NOTES) :
                new ObjectParameter("CUSTOMER_NOTES", typeof(string));

    var mODIFIED_BYParameter = mODIFIED_BY != null ?
                new ObjectParameter("MODIFIED_BY", mODIFIED_BY) :
                new ObjectParameter("MODIFIED_BY", typeof(string));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<ADD_CUSTOMER_JSON_Result>("ADD_CUSTOMER_JSON", cOMPANY_IDParameter, cUSTOMER_NAMEParameter, fIRST_NAMEParameter, lAST_NAMEParameter, aDDRESS_1Parameter, aDDRESS_2Parameter, cITY_IDParameter, sTATE_IDParameter, zIP_CODE_IDParameter, pRIMARY_PHONE_NUMBERParameter, aLTERNATE_PHONE_NUMBERParameter, sECONDARY_PHONE_NUMBERParameter, eMAIL_ADDRESSParameter, cUSTOMER_NOTESParameter, mODIFIED_BYParameter, cUSTOMER_ID);
}

Я выполняю вызов этой хранимой процедуры в моем контроллере здесь:

[HttpPost, Authorize]
public ObjectResult<ADD_CUSTOMER_JSON_Result> CreateCustomer([FromBody]dynamic customerInput)
{
    var identity = (ClaimsIdentity)User.Identity;
    var claimRole = identity.Claims.ToList()[0].Value.ToInt();
    var claimCompany = identity.Claims.ToList()[3].Value.ToInt();
    var claimUsername = identity.Claims.ToList()[5].Value.ToString();
    int[] allowedRoles = new int[] { 1, 2, 3 , 8};

    if (Array.IndexOf(allowedRoles, claimRole) != -1)
    {
        if (claimRole == 3 && claimCompany != customerInput["companyID"].ToString().ToInt())
        {
             throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized));
        }

        var companyID = (int)customerInput["COMPANY_ID"];
        var customerName = customerInput["CUSTOMER_NAME"].ToString();
        var firstName = customerInput["FIRST_NAME"].ToString();
        var lastName = customerInput["LAST_NAME"].ToString();
        var address_1 = customerInput["ADDRESS_1"].ToString();
        var address_2 = customerInput["ADDRESS_2"].ToString();
        var cityID = (int)customerInput["CITY_ID"];
        var stateID = (int)customerInput["STATE_ID"];
        var zipID = (int)customerInput["ZIP_CODE_ID"];
        var primaryPhoneNumber = customerInput["PRIMARY_PHONE_NUMBER"].ToString();
        var alternatePhoneNumber = customerInput["ALTERNATE_PHONE_NUMBER"].ToString();
        var secondaryPhoneNumber = customerInput["SECONDARY_PHONE_NUMBER"].ToString();
        var emailAddress = customerInput["EMAIL_ADDRESS"].ToString();
        var customerNotes = customerInput["CUSTOMER_NOTES"].ToString();
        var modifiedBy = claimUsername;

        ObjectParameter output = new ObjectParameter("cUSTOMER_ID", typeof(int));
        var test =  database.ADD_CUSTOMER_JSON(companyID, customerName, firstName, lastName, address_1, address_2, cityID, stateID, zipID, primaryPhoneNumber, alternatePhoneNumber, secondaryPhoneNumber, emailAddress, customerNotes, modifiedBy, output);
        return test;
    }

    throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized));
}

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

Я просто не понимаю, почему там написано, что у меня нет соответствующего столбца, если в качестве выходных данных указан столбец, возвращаемый с именем, которого следует ожидать. Фактически модель сложного типа также выглядит нормально, у нее есть только одно свойство, и это int с именем CUSTOMER_ID. Если я изменю свою функцию контроллера, чтобы она возвращала int, и изменит функциональный импорт на none, он будет работать, но всегда вернет -1, если я изменю функциональный импорт на скалярный, а затем int32, он снова будет жаловаться на пропущенные столбцы.

Дайте мне знать, где я могу уточнить что-либо. Также я попытался изменить SP, чтобы он не возвращал значение и возвращал только @CUSTOMER_ID, но это ничего не меняет.

РЕДАКТИРОВАТЬ Кроме того, еще одно странное явление, на которое я не могу ответить, это то, что когда я добавляю большинство хранимых процедур к сущности, если они имеют возврат, он автоматически делаетсложный тип и ссылки на него с функциональным импортом. Этот конкретный не делает, когда я «обновляю» свои хранимые процедуры и добавляю эту, это делает функциональный импорт, но ему не задано ни одного, и мне пришлось вручную создавать сложный тип. Я подумал, что это интересно, но в этой области мне немного не хватает знаний о сущности, поэтому я не до конца понимаю, почему так происходит.

1 Ответ

0 голосов
/ 08 ноября 2019

Я изменил SP, чтобы удалить и @CUSTOMER_ID, и Return Value, и запустил запрос, возвращающий CUSTOMER_ID, и это, похоже, сработало с незначительной настройкой вывода контроллера.

...