Вопрос по entity-framework, code-first, asp.net-mvc-3, nullable – Обнуляемое свойство для поля сущности, Entity Framework через Code First

59

Использование аннотации данныхRequired вот так:

[Required]
public int somefield {get; set;}

Будет устанавливатьsomefield вNot Null в базе данных, как я могу установитьsomefield чтобы разрешить NULL ?, я попытался установить его через SQL Server Management Studio, но Entity Framework установил его обратноNot Null.

Я на самом деле искал, чтобы узнать, как заставить CodeFirst делать NOT NULL, и ваш вопрос ответил на него отлично! Спасибо :) Andy Clarke

Ваш Ответ

4   ответа
93

Просто опустите атрибут [Обязательный] изstring somefield имущество. Это заставит его создатьNULLв состоянии столбец в БД.

Чтобы типы int допускали значения NULL в базе данных, они должны быть объявлены как пустые целые в модели:

// an int can never be null, so it will be created as NOT NULL in db
public int someintfield { get; set; }

// to have a nullable int, you need to declare it as an int?
// or as a System.Nullable<int>
public int? somenullableintfield { get; set; }
public System.Nullable<int> someothernullableintfield { get; set; }
Да, моя ошибка, мне нужно разрешить null для типов int. chrisramon
Что касается ситуации (крайний случай, но один, с которым я сталкиваюсь), атрибуты используются для проверки бизнес-правил и простоты использования с mvc, но должны позволить пользователю сохранять частично заполненные формы (то есть длинные формы, которые могут занять некоторое время для делать). Мне нужно иметь возможность разрешить EF создавать столбцы, которые допускают нулевые значения ... угадать его, как создатель мод, используемый при создании, но не знаю как
да, но это работает только для строк, а не для целочисленных типов. chrisramon
В вашем вопросе ваша собственность представляет собой строку. Чтобы заставить int разрешать пустые значения, вы должны объявить его как обнуляемое int, например так:public int? somenullableintfield { get; set; }
что произойдет, если вы поместите [Обязательный] в свойство типа NULL, например & public? somenullableintfield {get; задавать; } & Quot ;?
0

ВEf .net core Есть два варианта, которые вы можете сделать; Сначала с аннотациями данных:

public class Blog
{
    public int BlogId { get; set; }
    [Required]
    public string Url { get; set; }
}

Или с беглым API:

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property(b => b.Url)
            .IsRequired(false)//optinal case
            .IsRequired()//required case;
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

Есть больше деталейВот

3

Ответ Джона не сработал для меня, так как я получил ошибку компилятораCS0453 C# The type must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method

Это сработало для меня, хотя:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<SomeObject>().HasOptional(m => m.somefield);
    base.OnModelCreating(modelBuilder);
}
28

Другой вариант - указать EF, чтобы столбец был пустым:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        modelBuilder.Entity<SomeObject>().Property(m => m.somefield).IsOptional();            
        base.OnModelCreating(modelBuilder);
}

Этот код должен быть в объекте, который наследуется отDbContext.

Почему вы не используете ViewModels? Чем это может потребоваться в viewmodel и не требуется в реальной модели.
это может быть часть модели и модели представления, но необязательное поле, основанное на некоторой бизнес-логике. Ответ Данлудвига - более полное решение (stackoverflow.com/a/10710934/6486)
Отлично, спасибо. Это решило мою проблему со строками [Required], позволив им быть нулевыми в БД, но выполнив требование в помощниках MVC

Похожие вопросы