EFCode First Property Нулевая проблема - PullRequest
3 голосов
/ 31 марта 2011

Я использую EFCode First в модели asp.net mvc 3.(Entity Framework 4.0 и EFCode First 0.8) Модель определяется следующим образом:

public class User
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public int WorkedYears { get; set; }
}

при использовании db.Users.Find(1) выдаст эту ошибку:

Свойство WorkedYearsна 'User' не может быть установлено значение 'null'.Необходимо установить для этого свойства ненулевое значение типа Int32.

Примечание: user.Id = 1 существует в базе данных, и WorkedYears записи имеет значение NULL.если я установлю WorkedYears = 0 в базе данных, ошибка исчезнет, ​​а также, если я определю свойство, например: public int? WorkedYears{get; set;}, ошибка тоже будет разорвана.но я не хочу использовать int ?, а также хочу, чтобы столбец оставался NULL, если не установлен.Так есть ли другое решение, чтобы это исправить?

Большое спасибо.

1 Ответ

18 голосов
/ 31 марта 2011

Ваша модель не отражает вашу базу данных и поэтому не работает.Вы должны определить WorkedYears с int?.Если в вашем представлении это свойство является обязательным, вы должны определить новый класс «модель представления», в котором WorkedYears будет иметь значение NULL и обработать то, что должно содержать это свойство, если ваша база данных содержит значение NULL.

Исправьте POCO для EF:

public class User
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public int? WorkedYears { get; set; }
}

Модель правильного просмотра:

public class UserModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int WorkedYears { get; set; }
}

Ваш контроллер отвечает за преобразование User <-> UserModel.Если вы все еще хотите использовать один класс, вы должны добавить второе не сопоставленное свойство, которое будет внутренне использовать nullabe WorkedYears:

public class User
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public int? WorkedYears { get; set; }
    [NotMapped]
    public int WorkedYearsDisplay
    {
        get
        {
            return WorkedYears ?? 0;
        }
        set
        {
            WorkedYears = value == 0 ? new Nullable<int>() : value;
        }
    }
}

Вывод: если ваша база данных содержит поле Nullable, которое может содержать нулевое значение, вы должны иметь свойство Nullable вваш сопоставленный класс.Другого пути нет.

...