Member 8583441 Ответов: 1

При создании модели была обнаружена одна или несколько ошибок валидации


1) На самом деле я получаю эту ошибку в HandlingExceptionPolicy, имея SetExceptionManager.
2) значение, возвращается значение false во, из которого инструкции Select запроса LINQ.

Проблема вторая-это работа до вчерашнего дня, вдруг что случилось, я не знаю. Значение не является ложным, но оператор не выполняется.

В основном я использую Visual Studio 2015 Enterprise edition с SQL Server 2012 и подключением к базе данных с помощью Entity Framework 6.1.3, а мой проект был MVC 5 DbContext.

Ранее проект был выполнен с помощью Visual Studio 2010 с SQL Server 2008 и подключения к базе данных с помощью Entity Framework 4.1 с MVC 4 ObjectContext.

Я изменил некоторый код, который должен быть выполнен с конфигурацией Visual Studio 2015 Enterprise edition с SQL Server 2012.

Чтобы изменить ObjectContext на DbContext, я использовал Entity Framework 6 Power Tools.

Что я уже пробовал:

Это вторая постановка задачи
var objUser = (from u in dbContext.Users
               where u.LoginName.Equals(BO.LoginName)
               select u).FirstOrDefault();


Это первая постановка задачи
IConfigurationSource objIConfigurationSource = ConfigurationSourceFactory.Create();

if (objIConfigurationSource.GetSection(LoggingSettings.SectionName) != null)
    Logger.SetLogWriter(new LogWriterFactory(objIConfigurationSource).Create(), throwIfSet: false);
                
ExceptionPolicy.SetExceptionManager(new ExceptionPolicyFactory(objIConfigurationSource).CreateManager(), throwIfSet: false);

if (ExceptionPolicy.HandleException(ex, "Policy_Statement"))
    throw;


Я получаю ошибку в операторе throw "При создании модели была обнаружена одна или несколько ошибок валидации"

Пожалуйста, кто-нибудь может объяснить, что здесь происходит. Я объявил ключевой атрибут для классов poco.

[Key]
[Column(Order = 0)]
public Guid UsersID { get; set; }

[Key]
[Column(Order = 1)]
[StringLength(15)]
public string LoginName { get; set; }

[StringLength(1500)]
public string Password { get; set; }

public Guid? RoleID { get; set; }

[Key]
[Column(Order = 2)]
[StringLength(3)]
public string UserType { get; set; }

public bool? SuperUser { get; set; }

[Key]
[Column(Order = 3)]
public bool IsActive { get; set; }

[Key]
[Column(Order = 4)]
public Guid CreatedBy { get; set; }

[Key]
[Column(Order = 5)]
public DateTime CreatedDate { get; set; }

1 Ответов

Рейтинг:
11

Nathan Minier

Этот класс POCO немного искажен: вы объявили почти всю строку составным ключом!

Теперь, предполагая, что класс представляет строку в таблице Users, снимите украшения порядка ключей и столбцов со всего, кроме UsersId:

public class Users
{
   [Key]
   public Guid UsersID { get; set; }
 
   [StringLength(15)]
   public string LoginName { get; set; }
 
   [StringLength(1500)]
   public string Password { get; set; }
 
   public Guid? RoleID { get; set; }
 
   [StringLength(3)]
   public string UserType { get; set; }
 
   public bool? SuperUser { get; set; }
 
   public bool IsActive { get; set; }
 
   public Guid CreatedBy { get; set; }
 
   public DateTime CreatedDate { get; set; }
}


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

Мы можем сделать некоторые другие исправления. Во-первых, у вас есть nullables, где вы действительно не должны; всегда определяйте роль для пользователей, даже если вы используете гостевую роль по умолчанию. Нулевое значение может привести к неожиданным результатам при обработке кода безопасности. Кроме того, логически ясно, что пользователь является суперпользователем, но это лучше всего инкапсулируется ролью. Кроме того, похоже, что вы хотите определить там пару отношений, так что давайте сделаем это:

public class Users //v2.0
{
   [Key]
   public Guid UsersID { get; set; }
 
   //Changing this because the current code require exactly 15 characters
   [MinLength(3), MaxLength(15)] 
   public string LoginName { get; set; }
 
   // Changing this so that we can change hash algo later without issue
   [MaxLength(1500)]
   public string Password { get; set; }
 
   public Guid RoleID { get; set; }
 
   //This looks like it would be better defined as a relationship, or better
   //still this functionality should be rolled into roles.
   //[StringLength(3)] 
   //public string UserType { get; set; }
 
   //Divvy out Superuser responsibility to roles
   //public bool SuperUser { get; set; }
 
   public bool IsActive { get; set; }
 
   public Guid CreatedById { get; set; }
 
   public DateTime CreatedDate { get; set; }

   [ForeignKey("RoleID")]
   public virtual Role Role { get; set; }

   [ForeignKey("CreatedById")]
   public virtual Users CreatedBy { get; set; }
}


Member 8583441

Здравствуйте, Натан Миньер сэр, у меня есть небольшие сомнения относительно атрибута MinLength, MaxLength и атрибута StringLength

Member 8583441

Я изучал различия между ними с помощью этой ссылки https://stackoverflow.com/questions/5717033/stringlength-vs-maxlength-attributes-asp-net-mvc-with-entity-framework-ef-code-f

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

Nathan Minier

Я сделал еще несколько чтений (я должен знать лучше, чем доверять чему-либо, кроме исходных документов к настоящему времени), и формулировка, которую вы используете, действительно повлияет только на maxlength, но это оставляет нас с проблемой minlength; вы не хотите "" или string.Пусто, чтобы быть допустимыми значениями.