Властивість, що дозволяє обнулити поле поля сутності, Entity Framework через Code First


78

Використовуючи анотацію даних приблизно Requiredтак:

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

Буде встановлено SomeField до Not Nullв базі даних, Як я можу встановити SomeField дозволити NULLs?, Я спробував встановити його з допомогою SQL Server Management Studio , але Entity Framework встановити його назад Not Null.


7
Я насправді шукав, щоб дізнатись, як змусити CodeFirst робити НЕ НУЛЬ, і ваше запитання на нього ідеально відповіло! Спасибі :)
Енді Кларк,

Відповіді:


121

Просто опустіть атрибут [Обов’язково] з 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; }

5
У вашому запитанні ваша властивість - це рядок. Щоб int дозволив нульові значення, вам потрібно оголосити це як нульовий int, наприклад так:public int? somenullableintfield { get; set; }
danludwig

Так, моя помилка, мені потрібно дозволити null до типів int.
chrisramon

2
як щодо ситуації (крайовий випадок, але той, з яким я стикаюся), атрибути використовуються для перевірки ділових правил та простоти використання з mvc, але потрібно дозволити користувачеві зберігати частково заповнені форми (тобто довгі форми, на робити). Мені потрібно мати можливість дозволити EF створювати стовпці, що дозволяють нульові значення .. вгадуючи його, конструктор моделей, який використовується при створенні, але не знаю як
Джон

що трапиться, якщо ви покладете [Обов’язково] на властивість, що дозволяє обнулятись, на зразок "public int? somenullableintfield {get; set;}"?
AXMIM

@AXMIM ... трохи пізно ... але [Обов’язкова] анотація даних замінює int ?.
Кріс Катіньяні,

31

Інший варіант - сказати EF, щоб стовпець був нульовим:

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

Цей код повинен бути в об'єкті, який успадковує від DbContext.


1
Чудово, дякую. Це вирішило мою проблему із рядками [Обов’язково], дозволивши їм нульові значення в базі даних, але забезпечивши виконання вимоги у помічниках MVC
Деррік

2
Чому ви не використовуєте ViewModels? Тоді це може вимагатися в viewmodel і не вимагатись у реальній моделі.
Roel

це може бути частиною моделі та viewmodel, але необов’язковим полем, заснованим на певній бізнес-логіці. Відповідь danludwig - більш повне рішення ( stackoverflow.com/a/10710934/6486 )
Джон,

8

У 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; }
}

Детальніше тут


1
У випадку з EF Core це відповідь, яка працює.
joanlofe

4

Відповідь Джона не спрацювала для мене, оскільки я отримав помилку компілятора CS0453 C # Тип повинен бути ненульованим типом значення, щоб використовувати його як параметр 'T' у загальному типі або методі

Це мені вдалося:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<SomeObject>().HasOptional(m => m.somefield);
    base.OnModelCreating(modelBuilder);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.