Я боролся с этой проблемой некоторое время, я исправляю ее с одной машины, объединяюсь с GIT и тяну за другой (с идентичными базами данных), и ошибка возникает снова. Я не могу понять это для этого конкретного случая.
У меня есть хранимая процедура, которая возвращает следующее:
Когда я запускаю свой код и нажимаю на эту конечную точку, я получаю ошибку:
Устройство чтения данных несовместимо с указанным здесь моим комплексным типом . Элемент типа '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, но это ничего не меняет.
РЕДАКТИРОВАТЬ Кроме того, еще одно странное явление, на которое я не могу ответить, это то, что когда я добавляю большинство хранимых процедур к сущности, если они имеют возврат, он автоматически делаетсложный тип и ссылки на него с функциональным импортом. Этот конкретный не делает, когда я «обновляю» свои хранимые процедуры и добавляю эту, это делает функциональный импорт, но ему не задано ни одного, и мне пришлось вручную создавать сложный тип. Я подумал, что это интересно, но в этой области мне немного не хватает знаний о сущности, поэтому я не до конца понимаю, почему так происходит.