Ошибка проверки для одного или нескольких объектов. Увидеть EntityValidationErrors недвижимости для получения более подробной информации



у меня эта ошибка при заполнении базы данных с кодом первого подхода.




ошибка проверки для одного или нескольких объектов. Увидеть EntityValidationErrors недвижимости для получения более подробной информации.




честно говоря, я не знаю, как проверить содержание ошибок проверки. Visual Studio показывает мне, что это массив с 8 объектами, поэтому 8 ошибок проверки.



это работает с моей предыдущей моделью, но я сделал несколько изменений, которые я объясняю ниже:




  • у меня было перечисление под названием Status, я изменил его на класс под названием Status

  • Я изменил класс ApplicantsPositionHistory, чтобы иметь 2 внешних ключа к той же таблице


извините меня за длинный код, но я должен вставить все это. Исключение создается в последней строке следующего кода.



namespace Data.Model
{
public class Position
{
[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]
public int PositionID { get; set; }

[Required(ErrorMessage = "Position name is required.")]
[StringLength(20, MinimumLength = 3, ErrorMessage = "Name should not be longer than 20 characters.")]
[Display(Name = "Position name")]
public string name { get; set; }

[Required(ErrorMessage = "Number of years is required")]
[Display(Name = "Number of years")]
public int yearsExperienceRequired { get; set; }

public virtual ICollection<ApplicantPosition> applicantPosition { get; set; }
}

public class Applicant
{
[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]
public int ApplicantID { get; set; }

[Required(ErrorMessage = "Name is required")]
[StringLength(20, MinimumLength = 3, ErrorMessage="Name should not be longer than 20 characters.")]
[Display(Name = "First and LastName")]
public string name { get; set; }

[Required(ErrorMessage = "Telephone number is required")]
[StringLength(10, MinimumLength = 3, ErrorMessage = "Telephone should not be longer than 20 characters.")]
[Display(Name = "Telephone Number")]
public string telephone { get; set; }

[Required(ErrorMessage = "Skype username is required")]
[StringLength(10, MinimumLength = 3, ErrorMessage = "Skype user should not be longer than 20 characters.")]
[Display(Name = "Skype Username")]
public string skypeuser { get; set; }

public byte[] photo { get; set; }

public virtual ICollection<ApplicantPosition> applicantPosition { get; set; }
}

public class ApplicantPosition
{
[Key]
[Column("ApplicantID", Order = 0)]
public int ApplicantID { get; set; }

[Key]
[Column("PositionID", Order = 1)]
public int PositionID { get; set; }

public virtual Position Position { get; set; }

public virtual Applicant Applicant { get; set; }

[Required(ErrorMessage = "Applied date is required")]
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
[Display(Name = "Date applied")]
public DateTime appliedDate { get; set; }

[Column("StatusID", Order = 0)]
public int StatusID { get; set; }

public Status CurrentStatus { get; set; }

//[NotMapped]
//public int numberOfApplicantsApplied
//{
// get
// {
// int query =
// (from ap in Position
// where ap.Status == (int)Status.Applied
// select ap
// ).Count();
// return query;
// }
//}
}

public class Address
{
[StringLength(20, MinimumLength = 3, ErrorMessage = "Country should not be longer than 20 characters.")]
public string Country { get; set; }

[StringLength(20, MinimumLength = 3, ErrorMessage = "City should not be longer than 20 characters.")]
public string City { get; set; }

[StringLength(50, MinimumLength = 3, ErrorMessage = "Address should not be longer than 50 characters.")]
[Display(Name = "Address Line 1")]
public string AddressLine1 { get; set; }

[Display(Name = "Address Line 2")]
public string AddressLine2 { get; set; }
}

public class ApplicationPositionHistory
{
[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]
public int ApplicationPositionHistoryID { get; set; }

public ApplicantPosition applicantPosition { get; set; }

[Column("oldStatusID")]
public int oldStatusID { get; set; }

[Column("newStatusID")]
public int newStatusID { get; set; }

public Status oldStatus { get; set; }

public Status newStatus { get; set; }

[StringLength(500, MinimumLength = 3, ErrorMessage = "Comments should not be longer than 500 characters.")]
[Display(Name = "Comments")]
public string comments { get; set; }

[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
[Display(Name = "Date")]
public DateTime dateModified { get; set; }
}

public class Status
{
[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]
public int StatusID { get; set; }

[StringLength(20, MinimumLength = 3, ErrorMessage = "Status should not be longer than 20 characters.")]
[Display(Name = "Status")]
public string status { get; set; }
}
}





using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.IO;

namespace Data.Model
{
public class HRContextInitializer : DropCreateDatabaseAlways<HRContext>
{
protected override void Seed(HRContext context)
{
#region Status
Status applied = new Status() { status = "Applied" };
Status reviewedByHR = new Status() { status = "Reviewed By HR" };
Status approvedByHR = new Status() { status = "Approved by HR" };
Status rejectedByHR = new Status() { status = "Rejected by HR" };
Status assignedToTechnicalDepartment = new Status() { status = "Assigned to Technical Department" };
Status approvedByTechnicalDepartment = new Status() { status = "Approved by Technical Department" };
Status rejectedByTechnicalDepartment = new Status() { status = "Rejected by Technical Department" };

Status assignedToGeneralManager = new Status() { status = "Assigned to General Manager" };
Status approvedByGeneralManager = new Status() { status = "Approved by General Manager" };
Status rejectedByGeneralManager = new Status() { status = "Rejected by General Manager" };

context.Status.Add(applied);
context.Status.Add(reviewedByHR);
context.Status.Add(approvedByHR);
context.Status.Add(rejectedByHR);
context.Status.Add(assignedToTechnicalDepartment);
context.Status.Add(approvedByTechnicalDepartment);
context.Status.Add(rejectedByTechnicalDepartment);
context.Status.Add(assignedToGeneralManager);
context.Status.Add(approvedByGeneralManager);
context.Status.Add(rejectedByGeneralManager);
#endregion

#region Position
Position netdeveloper = new Position() { name = ".net developer", yearsExperienceRequired = 5 };
Position javadeveloper = new Position() { name = "java developer", yearsExperienceRequired = 5 };
context.Positions.Add(netdeveloper);
context.Positions.Add(javadeveloper);
#endregion

#region Applicants
Applicant luis = new Applicant()
{
name = "Luis",
skypeuser = "le.valencia",
telephone = "0491732825",
photo = File.ReadAllBytes(@"C:UsersLUIS.SIMBIOSDocumentsVisual Studio 2010ProjectsSlnHRHRRazorFormsContentpictures.jpg")
};

Applicant john = new Applicant()
{
name = "John",
skypeuser = "jo.valencia",
telephone = "3435343543",
photo = File.ReadAllBytes(@"C:UsersLUIS.SIMBIOSDocumentsVisual Studio 2010ProjectsSlnHRHRRazorFormsContentpictures.jpg")
};

context.Applicants.Add(luis);
context.Applicants.Add(john);
#endregion

#region ApplicantsPositions
ApplicantPosition appicantposition = new ApplicantPosition()
{
Applicant = luis,
Position = netdeveloper,
appliedDate = DateTime.Today,
StatusID = 1
};

ApplicantPosition appicantposition2 = new ApplicantPosition()
{
Applicant = john,
Position = javadeveloper,
appliedDate = DateTime.Today,
StatusID = 1
};

context.ApplicantsPositions.Add(appicantposition);
context.ApplicantsPositions.Add(appicantposition2);
#endregion

context.SaveChanges(); --->> Error here
}
}
}
847   24  

24 ответов:

честно говоря, я не знаю, как проверить содержание ошибок проверки. Visual Studio показывает мне, что это массив с 8 объектами, поэтому 8 ошибок проверки.

на самом деле вы должны увидеть ошибки, если вы детализируете этот массив в Visual studio во время отладки. Но вы также можете поймать исключение, а затем записать ошибки в какое-то хранилище журналов или консоль:

try
{
    // Your code...
    // Could also be before try if you know the exception occurs in SaveChanges

    context.SaveChanges();
}
catch (DbEntityValidationException e)
{
    foreach (var eve in e.EntityValidationErrors)
    {
        Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
            eve.Entry.Entity.GetType().Name, eve.Entry.State);
        foreach (var ve in eve.ValidationErrors)
        {
            Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                ve.PropertyName, ve.ErrorMessage);
        }
    }
    throw;
}

EntityValidationErrors - это коллекция, которая представляет субъекты который не может быть успешно проверен, и внутренняя коллекция ValidationErrors per entity-это список ошибок на уровне свойств.

эти сообщения проверки обычно достаточно полезно, чтобы найти источник проблемы.

Edit

несколько незначительных улучшений:

The стоимостью оскорбляющее свойство может быть включено во внутренний цикл следующим образом:

        foreach (var ve in eve.ValidationErrors)
        {
            Console.WriteLine("- Property: \"{0}\", Value: \"{1}\", Error: \"{2}\"",
                ve.PropertyName,
                eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName),
                ve.ErrorMessage);
        }

во время отладки Debug.Write может будьте предпочтительнее, чем Console.WriteLine как это работает во всех видах приложений, а не только консольных приложений (спасибо @Bart за его примечание в комментариях ниже).

для веб-приложений, которые находятся в производстве и использовании Elmah для регистрации исключений оказалось очень полезным для меня создать пользовательское исключение и перезаписать SaveChanges для того, чтобы бросить это новое исключение.

пользовательский тип исключения выглядит так:

public class FormattedDbEntityValidationException : Exception
{
    public FormattedDbEntityValidationException(DbEntityValidationException innerException) :
        base(null, innerException)
    {
    }

    public override string Message
    {
        get
        {
            var innerException = InnerException as DbEntityValidationException;
            if (innerException != null)
            {
                StringBuilder sb = new StringBuilder();

                sb.AppendLine();
                sb.AppendLine();
                foreach (var eve in innerException.EntityValidationErrors)
                {
                    sb.AppendLine(string.Format("- Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                        eve.Entry.Entity.GetType().FullName, eve.Entry.State));
                    foreach (var ve in eve.ValidationErrors)
                    {
                        sb.AppendLine(string.Format("-- Property: \"{0}\", Value: \"{1}\", Error: \"{2}\"",
                            ve.PropertyName,
                            eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName),
                            ve.ErrorMessage));
                    }
                }
                sb.AppendLine();

                return sb.ToString();
            }

            return base.Message;
        }
    }
}

и SaveChanges можно переписать следующим образом:

public class MyContext : DbContext
{
    // ...

    public override int SaveChanges()
    {
        try
        {
            return base.SaveChanges();
        }
        catch (DbEntityValidationException e)
        {
            var newException = new FormattedDbEntityValidationException(e);
            throw newException;
        }
    }
}

несколько замечаний:

  • желтый экран ошибки, который Elmah показывает в веб-интерфейсе или в отправленных сообщениях электронной почты (если вы настроили это) теперь отображает сведения о проверке непосредственно в верхней части сообщения.

  • перезаписи Message свойство в пользовательском исключении вместо перезаписи ToString() имеет преимущество, что стандарт ASP.NET " желтый экран смерти (YSOD) " также отображает это сообщение. В отличие от Elmah YSOD, по-видимому, не использует ToString(), но и отобразить Message собственность.

  • упаковка оригинал DbEntityValidationException как внутреннее исключение гарантирует, что исходная трассировка стека будет по-прежнему доступна и отображается в Elmah и YSOD.

  • , установив точку останова на строку throw newException; вы можете просто проверить newException.Message свойство в виде текста вместо детализация в коллекции проверки, которая немного неудобна и, похоже, не работает легко для всех (см. комментарии ниже).

Вы можете сделать это с помощью Visual Studio во время отладки, без написания какого-либо кода, даже не блок catch.

просто добавьте часы с именем:

((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors

часы выражение $exception отображает любое исключение, созданное в текущем контексте, даже если оно не было перехвачено и присвоено переменной.

на основе http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/

это действительно может сделать это без необходимости писать код:

в блоке catch добавьте точку останова в следующей строке кода:

catch (Exception exception)
{

}

Теперь, если вы наведете курсор на exception на Watch и затем перейдите к деталям исключения, как показано ниже; вы увидите, какие конкретные столбцы/ вызывают проблему, поскольку эта ошибка обычно возникает при нарушении ограничения таблицы..

enter image description here

большие изображение

вот как вы можете проверить содержимое EntityValidationErrors в Visual Studio (без написания дополнительного кода) т. е. во время отладка на IDE.

Проблема?

вы правы, отладчик Visual Studio Посмотреть Подробнее всплывающее окно не показывает фактические ошибки внутри EntityValidationErrors коллекция .

enter image description here

в Решение!

просто добавьте следующее выражение в Быстрый Просмотр окне и нажмите кнопку переоценка.

((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors

в моем случае, посмотрите, как я могу расширить в ValidationErrorsList внутри EntityValidationErrors коллекция

enter image description here

ссылки:mattrandle.me сообщение в блоге,@Йоэль это

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

((System.Data.Entity.Validation.DbEntityValidationException)$exception)
    .EntityValidationErrors.First()
    .ValidationErrors.First()

для всех, кто работает в VB.NET

Try
Catch ex As DbEntityValidationException
    For Each a In ex.EntityValidationErrors
        For Each b In a.ValidationErrors
            Dim st1 As String = b.PropertyName
            Dim st2 As String = b.ErrorMessage
        Next
    Next
End Try

пока вы находитесь в режиме отладки в пределах catch {...} блок откройте окно "QuickWatch" (ctrl+ alt+q) и вставить туда:

((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors

или:

((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors

если вы не находитесь в try / catch или не имеете доступа к объекту исключения.

Это позволит вам углубиться в ValidationErrors дерево. Это самый простой способ я нашел, чтобы получить мгновенный понимание этих ошибок.

Если вы просто ловите общее исключение, вам может быть полезно использовать это как DbEntityValidationException. Этот тип исключения имеет свойство ошибки проверки, и продолжая расширять свой путь в них, вы найдете все проблемы.

например, если вы поместите точку останова в ловушку, вы можете бросить в часы следующее:

((System.Data.Entity.Validation.DbEntityValidationException ) ex)

примером ошибки является Если поле не допускает значения NULL, и у вас есть нулевая строка, вы увидите, что она говорит, что поле является обязательным.

в debug, вы можете ввести это в поле ввода QuickWatch expression evaluator:

context.GetValidationErrors()

просто проверьте длину поля таблицы базы данных . Ваш входной текст больше, чем длина поля столбца тип данных length

Я должен был написать это в окне immediate :3

(((exception as System.Data.Entity.Validation.DbEntityValidationException).EntityValidationErrors as System.Collections.Generic.List<System.Data.Entity.Validation.DbEntityValidationResult>)[0].ValidationErrors as System.Collections.Generic.List<System.Data.Entity.Validation.DbValidationError>)[0]

для того, чтобы углубиться в точную ошибку !

отметим, что Entity.GetType().BaseType.Name дает имя типа, которое вы указали, а не со всеми шестнадцатеричными цифрами в его имени.

используя ответ @Slauma я сделал фрагмент кода (окружает с фрагментом) для лучшего использования.

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <SnippetTypes>
        <SnippetType>SurroundsWith</SnippetType>
      </SnippetTypes>
      <Title>ValidationErrorsTryCatch</Title>
      <Author>Phoenix</Author>
      <Description>
      </Description>
      <HelpUrl>
      </HelpUrl>
      <Shortcut>
      </Shortcut>
    </Header>
    <Snippet>
      <Code Language="csharp"><![CDATA[try
{
    $selected$ $end$
}
catch (System.Data.Entity.Validation.DbEntityValidationException e)
{
    foreach (var eve in e.EntityValidationErrors)
    {
        Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
            eve.Entry.Entity.GetType().Name, eve.Entry.State);
        foreach (var ve in eve.ValidationErrors)
        {
            Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                ve.PropertyName, ve.ErrorMessage);
        }
    }
    throw;
}]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

за ответ @Slauma и предложение @Milton я расширил пользовательский метод сохранения нашего базового класса с помощью try / catch, который будет обрабатывать (и, следовательно, регистрировать наши ошибки!) такого рода исключения.

// Where `BaseDB` is your Entities object... (it could be `this` in a different design)
public void Save(bool? validateEntities = null)
{
    try
    {
        //Capture and set the validation state if we decide to
        bool validateOnSaveEnabledStartState = BaseDB.Configuration.ValidateOnSaveEnabled;
        if (validateEntities.HasValue)
            BaseDB.Configuration.ValidateOnSaveEnabled = validateEntities.Value;

        BaseDB.SaveChanges();

        //Revert the validation state when done
        if (validateEntities.HasValue)
            BaseDB.Configuration.ValidateOnSaveEnabled = validateOnSaveEnabledStartState;
    }
    catch (DbEntityValidationException e)
    {
        StringBuilder sb = new StringBuilder();
        foreach (var eve in e.EntityValidationErrors)
        {
            sb.AppendLine(string.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", 
                                            eve.Entry.Entity.GetType().Name,
                                            eve.Entry.State));
            foreach (var ve in eve.ValidationErrors)
            {
                sb.AppendLine(string.Format("- Property: \"{0}\", Error: \"{1}\"",
                                            ve.PropertyName,
                                            ve.ErrorMessage));
            }
        }
        throw new DbEntityValidationException(sb.ToString(), e);
    }
}

поймать исключение в try catch, а затем quick watch или ctrl+d & ctrl+q, и вы можете перейти к EntityValidationErrors.

ответ от @Slauma действительно велик, но я обнаружил, что он не работал, когда свойство ComplexType было недействительным.

например, скажем, у вас есть собственность Phone сложного типа PhoneNumber. Если AreaCode свойство недопустимо, имя свойства в ve.PropertyNames это "телефон.Зоны". Это вызывает вызов eve.Entry.CurrentValues<object>(ve.PropertyName) на провал.

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

ниже @Slauma это FormattedDbEntityValidationException класс с поддержкой сложных типов.

наслаждайтесь!

[Serializable]
public class FormattedDbEntityValidationException : Exception
{
    public FormattedDbEntityValidationException(DbEntityValidationException innerException) :
        base(null, innerException)
    {
    }

    public override string Message
    {
        get
        {
            var innerException = InnerException as DbEntityValidationException;
            if (innerException == null) return base.Message;

            var sb = new StringBuilder();

            sb.AppendLine();
            sb.AppendLine();
            foreach (var eve in innerException.EntityValidationErrors)
            {
                sb.AppendLine(string.Format("- Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                    eve.Entry.Entity.GetType().FullName, eve.Entry.State));
                foreach (var ve in eve.ValidationErrors)
                {
                    object value;
                    if (ve.PropertyName.Contains("."))
                    {
                        var propertyChain = ve.PropertyName.Split('.');
                        var complexProperty = eve.Entry.CurrentValues.GetValue<DbPropertyValues>(propertyChain.First());
                        value = GetComplexPropertyValue(complexProperty, propertyChain.Skip(1).ToArray());
                    }
                    else
                    {
                        value = eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName);
                    }
                    sb.AppendLine(string.Format("-- Property: \"{0}\", Value: \"{1}\", Error: \"{2}\"",
                        ve.PropertyName,
                        value,
                        ve.ErrorMessage));
                }
            }
            sb.AppendLine();

            return sb.ToString();
        }
    }

    private static object GetComplexPropertyValue(DbPropertyValues propertyValues, string[] propertyChain)
    {
        var propertyName = propertyChain.First();
        return propertyChain.Count() == 1 
            ? propertyValues[propertyName] 
            : GetComplexPropertyValue((DbPropertyValues)propertyValues[propertyName], propertyChain.Skip(1).ToArray());
    }
}

просто бросаю свои два цента...

в моей конфигурации dbConfiguration.cs, мне нравится обертывать мой контекст.Метод SaveChanges () в try/catch и создает выходной текстовый файл, который позволяет мне четко читать ошибки, и этот код также помечает их - удобно, если вы сталкиваетесь с более чем одной ошибкой в разное время!

        try
        {
            context.SaveChanges();
        }
        catch (DbEntityValidationException e)
        {
            //Create empty list to capture Validation error(s)
            var outputLines = new List<string>();

            foreach (var eve in e.EntityValidationErrors)
            {
                outputLines.Add(
                    $"{DateTime.Now}: Entity of type \"{eve.Entry.Entity.GetType().Name}\" in state \"{eve.Entry.State}\" has the following validation errors:");
                outputLines.AddRange(eve.ValidationErrors.Select(ve =>
                    $"- Property: \"{ve.PropertyName}\", Error: \"{ve.ErrorMessage}\""));
            }
            //Write to external file
            File.AppendAllLines(@"c:\temp\dbErrors.txt", outputLines);
            throw;
        }

Что я нашел...когда я получил 'EntityValidationErrors' ошибка в том, что....у меня есть поле в моей базе данных " db1 "в таблице" tbladdress " как "address1", который имеет размер 100 (т. е. адрес varchar(100) null), и я передавал значение более 100 символов..и это приводит к ошибке при сохранении данных в базу данных....

таким образом, вы должны проверить данные, которые вы передаете в поле.

это работает для меня.

var modelState = ModelState.Values;
if (!ModelState.IsValid)
{
    return RedirectToAction("Index", "Home", model);
}

поставить точку останова на Оператор if. Затем вы можете проверить modelState в отладочных окнах. На каждом значении вы можете увидеть, если есть ошибка и даже сообщение об ошибке. Вот и все. Когда вам это больше не нужно, просто удалите или прокомментируйте строку.

Я надеюсь, что это поможет.

если попросят, я могу предоставить подробный скриншот в окне отладки.

Как упоминалось в других сообщениях, просто поймать исключение в классе DbEntityValidationException. Что даст вам воду, которую вы требуете во время ошибок.

 try
 {
  ....
 }
 catch(DbEntityValidationException ex)
 {
  ....
 }

я столкнулся с этой ошибки, перед

когда я попытался обновить конкретное поле в моей модели в entity framwork

Letter letter = new Letter {ID = letterId, ExportNumber = letterExportNumber,EntityState = EntityState.Modified};
LetterService.ChangeExportNumberfor(letter);
//----------


public int ChangeExportNumber(Letter letter)
    {
        int result = 0;
        using (var db = ((LettersGeneratorEntities) GetContext()))
        {
            db.Letters.Attach(letter);
            db.Entry(letter).Property(x => x.ExportNumber).IsModified = true;
            result += db.SaveChanges();
        }
        return result;
    }

и в соответствии с приведенными выше ответами

Я нашел сообщение проверки The SignerName field is required.

, который указывает на поле в моей модели

и когда я проверил свою схему базы данных я нашел

enter image description here

Так что прочь кур ValidationException имеет право поднять

и в соответствии с этим полем я хочу, чтобы он был nullable, (я не знаю, как я испортил его)

поэтому я изменил это поле, чтобы разрешить Null, и по этому мой код не даст мне эту ошибку снова

Так что эта ошибка, возможно, произойдет, если вы аннулируете целостность данных вашей базы данных

пожалуйста, проверьте значения полей, которые вы передаете, действительны и в соответствии с полями базы данных. Например, количество символов, переданных в определенном поле, меньше, чем символы, определенные в поле таблицы базы данных.

если вы используете IIS С Аутентификация Windows и Entity Framework, будьте осторожны, чтобы использовать authorize.

пробовал POST без авторизации и это не сработало, и получаете эту ошибку на db.SaveChangesAsync();, в то время как все остальные глаголы GET и DELETE работали.

но когда я добавил AuthorizeAttribute в качестве аннотации, это сработало.

[Authorize]
public async Task<IHttpActionResult> Post(...){
....
}

проверить, есть ли у вас Not Null ограничение в столбцах таблицы, и вы не передаете значение для этого столбца во время операций вставки/обновления. Что вызывает это исключение в рамках организации.

Comments

    Ничего не найдено.