277

is there "elegant" way to give specific property a default value ?

Maybe by DataAnnotations, something like :

[DefaultValue("true")]
public bool Active { get; set; }

Thank you.

8
  • 2
    Maybe try in the constructor this.Active = true;? I think the DB value will take precedence when fetching, but careful if new'ing then attaching an entity for an update without a fetch first, as the change tracking might see this as you wanting to update the value. Comment because I haven't used EF in a long time, and I feel like this is a shot in the dark. Commented Oct 23, 2013 at 23:22
  • 3
    Thank you for response, I have used this method so far stackoverflow.com/a/5032578/2913441 but I thought that maybe there is a better way. Commented Oct 23, 2013 at 23:34
  • 4
    public bool Inactive { get; set; } 😉 Commented Feb 23, 2018 at 19:02
  • as Microsoft docs say "You can not set a default value using Data Annotations." Commented Dec 23, 2018 at 9:23
  • Please refere https://stackoverflow.com/a/59551802/8403632 Commented Jan 1, 2020 at 11:06

21 Answers 21

199

You can do it by manually edit code first migration:

public override void Up()
{    
   AddColumn("dbo.Events", "Active", c => c.Boolean(nullable: false, defaultValue: true));
} 
Sign up to request clarification or add additional context in comments.

8 Comments

I'm not sure this will work if OP doesn't specially set Active to true when creating an Event object as well. The default value always be false on a non nullable bool property, so unless changed, this is what entity framework will save to the db. Or am I missing something?
@GFoley83, yes, you are right. This method only add default constraint at database level. For complete solution you also need to assign default value in constructor of entity or use property with backed field as shown in answer above
This works for base types. For something like DATETIMEOFFSET, use the , defaultValueSql: "SYSDATETIMEOFFSET", and NOT the defaultValue as this defaultValue: System.DateTimeOffset.Now, will resolve to a string of the current system datetimeoffset value.
AFAIK your manual changes will get lost in case of re-scaffolding the migration
@ninbit i think you shuld write migration to remove it at database level first, then change your DAL mapping
|
103

It's been a while, but I'm leaving a note for others. I achieved what was needed with an attribute and decorated my model class fields with that attribute as I wanted.

[SqlDefaultValue("getutcdate()")]
public DateTime CreatedDateUtc { get; set; }

Got the help of these 2 articles:

What I did:

Define Attribute

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class SqlDefaultValueAttribute : Attribute
{
    public SqlDefaultValueAttribute(string defaultValue)
    {
        DefaultValue = defaultValue;
    }

    public string DefaultValue { get; set; }
}

In the "OnModelCreating" of the context

modelBuilder.Conventions.Add( new AttributeToColumnAnnotationConvention<SqlDefaultValueAttribute, string>("SqlDefaultValue", (p, attributes) => attributes.Single().DefaultValue));

In the custom SqlGenerator

private void SetAnnotatedColumn(ColumnModel col)
{
    AnnotationValues values;
    if (col.Annotations.TryGetValue("SqlDefaultValue", out values))
    {
         col.DefaultValueSql = (string)values.NewValue;
    }
}

Then in the Migration Configuration constructor, register the custom SQL generator.

SetSqlGenerator("System.Data.SqlClient", new CustomMigrationSqlGenerator());

7 Comments

You can even do it globally without putting [SqlDefaultValue(DefaultValue = "getutcdate()")] on every entity. 1) Simply remove modelBuilder.Conventions.Add( new AttributeToColumnAnnotationConvention<SqlDefaultValueAttribute, string>("SqlDefaultValue", (p, attributes) => attributes.Single().DefaultValue)); 2) Add modelBuilder.Properties().Where(x => x.PropertyType == typeof(DateTime)).Configure(c => c.HasColumnType("datetime2").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).HasColumnAnnotation("SqlDefaultValue", "getdate()"));
Where's the custom SqlGenerator please?
@ravinsp why don't customize the MigrationCodeGenerator class to have the migration with the right information rather than the SqlGenerator code? The SQL code is the last step...
@Alex Worth trying! That would also work and would be more elegant than injecting SQL code. But I'm not sure about the complexity of overriding the C# MigrationCodeGenerator.
Where is HarmonyMigrationSqlGenerator?
|
96

The above answers really helped, but only delivered part of the solution. The major issue is that as soon as you remove the Default value attribute, the constraint on the column in database won't be removed. So previous default value will still stay in the database.

Here is a full solution to the problem, including removal of SQL constraints on attribute removal. I am also re-using .NET Framework's native DefaultValue attribute.

Usage

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[DefaultValue("getutcdate()")]
public DateTime CreatedOn { get; set; }

For this to work you need to update IdentityModels.cs and Configuration.cs files

IdentityModels.cs file

Add/update this method in your ApplicationDbContext class

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
            base.OnModelCreating(modelBuilder);
            var convention = new AttributeToColumnAnnotationConvention<DefaultValueAttribute, string>("SqlDefaultValue", (p, attributes) => attributes.SingleOrDefault().Value.ToString());
            modelBuilder.Conventions.Add(convention);
}

Configuration.cs file

Update your Configuration class constructor by registering custom Sql generator, like this:

internal sealed class Configuration : DbMigrationsConfiguration<ApplicationDbContext>
{
    public Configuration()
    {
        // DefaultValue Sql Generator
        SetSqlGenerator("System.Data.SqlClient", new DefaultValueSqlServerMigrationSqlGenerator());
    }
}

Next, add custom Sql generator class (you can add it to the Configuration.cs file or a separate file)

internal class DefaultValueSqlServerMigrationSqlGenerator : SqlServerMigrationSqlGenerator
{
    private int dropConstraintCount;

    protected override void Generate(AddColumnOperation addColumnOperation)
    {
        SetAnnotatedColumn(addColumnOperation.Column, addColumnOperation.Table);
        base.Generate(addColumnOperation);
    }

    protected override void Generate(AlterColumnOperation alterColumnOperation)
    {
        SetAnnotatedColumn(alterColumnOperation.Column, alterColumnOperation.Table);
        base.Generate(alterColumnOperation);
    }

    protected override void Generate(CreateTableOperation createTableOperation)
    {
        SetAnnotatedColumns(createTableOperation.Columns, createTableOperation.Name);
        base.Generate(createTableOperation);
    }

    protected override void Generate(AlterTableOperation alterTableOperation)
    {
        SetAnnotatedColumns(alterTableOperation.Columns, alterTableOperation.Name);
        base.Generate(alterTableOperation);
    }

    private void SetAnnotatedColumn(ColumnModel column, string tableName)
    {
        if (column.Annotations.TryGetValue("SqlDefaultValue", out var values))
        {
            if (values.NewValue == null)
            {
                column.DefaultValueSql = null;
                using var writer = Writer();

                // Drop Constraint
                writer.WriteLine(GetSqlDropConstraintQuery(tableName, column.Name));
                Statement(writer);
            }
            else
            {
                column.DefaultValueSql = (string)values.NewValue;
            }
        }
    }

    private void SetAnnotatedColumns(IEnumerable<ColumnModel> columns, string tableName)
    {
        foreach (var column in columns)
        {
            SetAnnotatedColumn(column, tableName);
        }
    }

    private string GetSqlDropConstraintQuery(string tableName, string columnName)
    {
        var tableNameSplitByDot = tableName.Split('.');
        var tableSchema = tableNameSplitByDot[0];
        var tablePureName = tableNameSplitByDot[1];

        var str = $@"DECLARE @var{dropConstraintCount} nvarchar(128)
SELECT @var{dropConstraintCount} = name
FROM sys.default_constraints
WHERE parent_object_id = object_id(N'{tableSchema}.[{tablePureName}]')
AND col_name(parent_object_id, parent_column_id) = '{columnName}';
IF @var{dropConstraintCount} IS NOT NULL
EXECUTE('ALTER TABLE {tableSchema}.[{tablePureName}] DROP CONSTRAINT [' + @var{dropConstraintCount} + ']')";

        dropConstraintCount++;
        return str;
    }
}

11 Comments

This approach worked perfectly for me. One enhancement I made was to also override Generate(CreateTableOperation createTableOperation) and Generate(AddColumnOperation addColumnOperation) with the same logic so those scenarios are also caught. I also only check values.NewValue is null as I wanted my default to be an empty string.
@Delorian I have updated my answer, thank you for your comments
I've made an edit to your post to support instances where a rollback is dropping more than one constraint. Your script would throw an error stating that @con was already declared. I created a private variable to hold a counter and simply increment it. I also changed the format of the drop constraint to more closely match what EF sends to SQL when creating the constraint. Great work on this!
Thanks for solution but I have two problems: 1. Table names need brackets. 2. In update new value not set and default value set instead!
Do I need the set the [DatabaseGenerated(DatabaseGeneratedOption.Computed)] attribute? If so, why? In my tests it seemed to have no effect leaving it out.
|
30

Your model properties don't have to be 'auto properties' Even though that is easier. And the DefaultValue attribute is really only informative metadata The answer accepted here is one alternative to the constructor approach.

public class Track
{

    private const int DEFAULT_LENGTH = 400;
    private int _length = DEFAULT_LENGTH;
    [DefaultValue(DEFAULT_LENGTH)]
    public int LengthInMeters {
        get { return _length; }
        set { _length = value; }
    }
}

vs.

public class Track
{
    public Track()
    {
        LengthInMeters = 400;   
    }

    public int LengthInMeters { get; set; }        
}

This will only work for applications creating and consuming data using this specific class. Usually this isn't a problem if data access code is centralized. To update the value across all applications you need to configure the datasource to set a default value. Devi's answer shows how it can be done using migrations, sql, or whatever language your data source speaks.

5 Comments

Note: This will not set a default value in the database. Other programs not using your entity will not get that default value.
This part of the answer, but it doesn't work if you are inserting records in ways other than through Entity Framework. Also if you are creating a new non-null column on a table, this will not give you the ability to set the default value for existing records. @devi has a valuable addition below.
Why is your first approach the "correct" way? Will you run into unintended issues with the constructor approach?
a matter of opinion, and those change :) And probably not.
Under certain circumstances, I've had issues with the constructor approach; setting a default value in the backing field seems to be the least invasive solution.
17

What I did, I initialized values in the constructor of the entity

Note: DefaultValue attributes won't set the values of your properties automatically, you have to do it yourself

3 Comments

The problem with the constructor setting the value is that EF will do an update to the database when committing the transaction.
The model first crete the default values by this way
The DefaultValue is a species that lives in far away, foreign lands, too shy to encounter your properties by itself. Do not make a sound, it is easily scared away - should it ever come near enough to hear it. +1 for stating the not at all obvious.
9

After @SedatKapanoglu comment, I am adding all my approach that works, because he was right, just using the fluent API does not work.

1- Create custom code generator and override Generate for a ColumnModel.

   public class ExtendedMigrationCodeGenerator : CSharpMigrationCodeGenerator
{

    protected override void Generate(ColumnModel column, IndentedTextWriter writer, bool emitName = false)
    {

        if (column.Annotations.Keys.Contains("Default"))
        {
            var value = Convert.ChangeType(column.Annotations["Default"].NewValue, column.ClrDefaultValue.GetType());
            column.DefaultValue = value;
        }


        base.Generate(column, writer, emitName);
    }

}

2- Assign the new code generator:

public sealed class Configuration : DbMigrationsConfiguration<Data.Context.EfSqlDbContext>
{
    public Configuration()
    {
        CodeGenerator = new ExtendedMigrationCodeGenerator();
        AutomaticMigrationsEnabled = false;
    }
}

3- Use fluent api to created the Annotation:

public static void Configure(DbModelBuilder builder){    
builder.Entity<Company>().Property(c => c.Status).HasColumnAnnotation("Default", 0);            
}

1 Comment

Please could see my complete solution, I added all my implementation of how it works, thanks.
9

I admit that my approach escapes the whole "Code First" concept. But if you have the ability to just change the default value in the table itself... it's much simpler than the lengths that you have to go through above... I'm just too lazy to do all that work!

It almost seems as if the posters original idea would work:

[DefaultValue(true)]
public bool IsAdmin { get; set; }

I thought they just made the mistake of adding quotes... but alas no such intuitiveness. The other suggestions were just too much for me (granted I have the privileges needed to go into the table and make the changes... where not every developer will in every situation). In the end I just did it the old fashioned way. I set the default value in the SQL Server table... I mean really, enough already! NOTE: I further tested doing an add-migration and update-database and the changes stuck. enter image description here

3 Comments

the biggest issue with doing things manually isn't that it's too much work but that it is prone to mistakes, unreliable, and unreviewable.
That's the same problem you have doing it automatically, plus it's too much work.
if you code it, you have one point where mistakes can occur, instead of hundreds (every default property). it will be reviewed on PR by other people. you can rely on it happening exactly the same way every time. -> reliable, reviewable, manageable that is not counting that you have multiple machines, that you don't have permissions, or that you hand over the project to the next guy. also i implemented it by code and it is less work eventually.
9

In .NET Core 3.1 you can do the following in the model class:

    public bool? Active { get; set; } 

In the DbContext OnModelCreating you add the default value.

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Foundation>()
            .Property(b => b.Active)
            .HasDefaultValueSql("1");

        base.OnModelCreating(modelBuilder);
    }

Resulting in the following in the database

enter image description here

Note: If you don't have nullable (bool?) for you property you will get the following warning

The 'bool' property 'Active' on entity type 'Foundation' is configured with a database-generated default. This default will always be used for inserts when the property has the value 'false', since this is the CLR default for the 'bool' type. Consider using the nullable 'bool?' type instead so that the default will only be used for inserts when the property value is 'null'.

1 Comment

OP's question is regarding EF6, not EF Core.
7

It's simple! Just annotate with required.

[Required]
public bool MyField { get; set; }

the resultant migration will be:

migrationBuilder.AddColumn<bool>(
name: "MyField",
table: "MyTable",
nullable: false,
defaultValue: false);

If you want true, change the defaultValue to true in the migration before updating the database

4 Comments

the autogenerated migration can then be changed and you will forguet about the defaultvalue
Simple and works, helps to quickly add a column to an existing table with a foreign key constraint on the new column. Thanks
And what if we need the default value to be true?
@ChristosLytras Just rename the column to NotMyField /s
4

I found that just using Auto-Property Initializer on entity property is enough to get the job done.

For example:

public class Thing {
    public bool IsBigThing{ get; set; } = false;
}

4 Comments

You'd think this would work, with code first. But it did not for me with EF 6.2.
This actually works perfectly for Code First EF 6. I am not sure why negative score for this answer. I gave one upvote.
Does not work with EF Core 5.0.13. I ended up just manually editing the migration to have ..., defaultValue: false);
This works to get the default values into the database, but it doesn't put the default constraint into the database.
4

In EF core released 27th June 2016 you can use fluent API for setting default value. Go to ApplicationDbContext class, find/create the method name OnModelCreating and add the following fluent API.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<YourTableName>()
        .Property(b => b.Active)
        .HasDefaultValue(true);
}

2 Comments

OP asks about EF6, not EF Core
If someone is interested. I've found a way to use the [DefaultValue] attribute (described in another answer here) in EF Core. stackoverflow.com/a/64803061/1462234
4

If you are using Entity Framework Core and want to use Data Annotations instead of Fluent API, you will need to create a custom attribute along with a custom convention.

SqlDefaultValueAttribute.cs

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class SqlDefaultValueAttribute : Attribute
{
    public SqlDefaultValueAttribute(string defaultValue)
    {
        DefaultValue = defaultValue;
    }

    public string DefaultValue { get; set; }
}

SqlDefaultValueConvention.cs

public class SqlDefaultValueConvention
    : PropertyAttributeConventionBase<SqlDefaultValueAttribute>
{
    public SqlDefaultValueConvention(ProviderConventionSetBuilderDependencies dependencies)
        : base(dependencies) { }

    protected override void ProcessPropertyAdded(
        IConventionPropertyBuilder propertyBuilder,
        SqlDefaultValueAttribute attribute,
        MemberInfo clrMember,
        IConventionContext context)
    {
        propertyBuilder.HasDefaultValueSql(attribute.DefaultValue);
    }
}

You will then need to register the convention within your DbContext

public class ApplicationDbContext : DbContext
{
    protected override void ConfigureConventions(
        ModelConfigurationBuilder configurationBuilder)
    {
        configurationBuilder.Conventions.Add(services =>
            new SqlDefaultValueConvention(
                services.GetRequiredService<ProviderConventionSetBuilderDependencies>()));
    }
}

You can now use it like this:

public class MyEntity
{
    [SqlDefaultValue("getdate()")]
    public DateTime CreatedAt { get; set; }
}

2 Comments

This should be the accepted answer, as plain old "DefaultValue" doesn't work still in EF9. This solution worked like a charmn. Thanks!
This worked well. However, I did need to add sentinel values for boolean and integer columns. EF doesn't send a value, letting the database use the default, when the value it has matches the sentinel value. For reference types the default sentinel value of null works well. For simple types, the sentinel value is a valid value that you might want to set. Setting the sentinel value to the database default value makes it work, since when the default value is wanted nothing will be sent and the database will use the default you set there.
2
using System.ComponentModel;

[DefaultValue(true)]

public bool Active { get; set; }

2 Comments

As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.
EF doesn't seem to care about the presence of a [DefaultValue] attribute. It is not possible to configure default database column values using data annotations.
0

Just Overload the default constructor of Model class and pass any relevant parameter which you may or may not use. By this you can easily supply default values for attributes. Below is an example.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Aim.Data.Domain
{
    [MetadataType(typeof(LoginModel))]
    public partial class Login
    {       
        public Login(bool status)
        {
            this.CreatedDate = DateTime.Now;
            this.ModifiedDate = DateTime.Now;
            this.Culture = "EN-US";
            this.IsDefaultPassword = status;
            this.IsActive = status;
            this.LoginLogs = new HashSet<LoginLog>();
            this.LoginLogHistories = new HashSet<LoginLogHistory>();
        }


    }

    public class LoginModel
    {

        [Key]
        [ScaffoldColumn(false)] 
        public int Id { get; set; }
        [Required]
        public string LoginCode { get; set; }
        [Required]
        public string Password { get; set; }
        public string LastPassword { get; set; }     
        public int UserGroupId { get; set; }
        public int FalseAttempt { get; set; }
        public bool IsLocked { get; set; }
        public int CreatedBy { get; set; }       
        public System.DateTime CreatedDate { get; set; }
        public Nullable<int> ModifiedBy { get; set; }      
        public Nullable<System.DateTime> ModifiedDate { get; set; }       
        public string Culture { get; set; }        
        public virtual ICollection<LoginLog> LoginLogs { get; set; }
        public virtual ICollection<LoginLogHistory> LoginLogHistories { get; set; }
    }

}

1 Comment

This suggestion is totally client side logic. This "works" as long as you will only interact with the database using the application. As soon as someone wants to insert a record manually or from another application, you realize the downside that there is no default expression in the schema and this cannot scale to other clients. Although it wasn't explicitly stated, this legitimate topic implies the requirement to get EF to create a migration that places a default expression into the column definition.
0

I tried the [DefaultValue(getdate())] and [DefaultValue(getutcdate())] attributes but this did not work, if the column in the database is not null.

I used a constructor to set the default value for the datetime fields and it worked fine when creating new records using EF:

public MyModel
{
    DateTime currDateTime = DateTime.Now;
    CreationDT = currDateTime;
}

Comments

0

The answer provided by J-M works well for me but with some modification, as I am using Npgsql and the Generate function will not get run during Update-Database as the provider is different (the original answer is for SqlServer).

If you are using Npgsql as your provider, just make some slight modification so it works with Npgsql:

Configuration.cs file

Update your Configuration class constructor by registering custom Sql generator, like this:

internal sealed class Configuration : DbMigrationsConfiguration<ApplicationDbContext>
{
    public Configuration()
    {
        // DefaultValue Sql Generator
        SetSqlGenerator("Npgsql", new DefaultValueNpgsqlMigrationSqlGenerator());
    }
}

Next, add custom Sql generator class (you can add it to the Configuration.cs file or a separate file)

internal class DefaultValueNpgsqlMigrationSqlGenerator : NpgsqlMigrationSqlGenerator
{
    private int dropConstraintCount;

    public override IEnumerable<MigrationStatement> Generate(IEnumerable<MigrationOperation> migrationOperations, string providerManifestToken)
    {
        foreach (var operation in migrationOperations)
        {
            if (operation is AddColumnOperation addColumnOperation)
            {
                SetAnnotatedColumn(addColumnOperation.Column, addColumnOperation.Table);
            }
            else if (operation is AlterColumnOperation alterColumnOperation)
            {
                SetAnnotatedColumn(alterColumnOperation.Column, alterColumnOperation.Table);
            }
            else if (operation is CreateTableOperation createTableOperation)
            {
                SetAnnotatedColumns(createTableOperation.Columns, createTableOperation.Name);
            }
            else if (operation is AlterTableOperation alterTableOperation)
            {
                SetAnnotatedColumns(alterTableOperation.Columns, alterTableOperation.Name);
            }
        }

        return base.Generate(migrationOperations, providerManifestToken);
    }

    private void SetAnnotatedColumn(ColumnModel column, string tableName)
    {
        if (column.Annotations.TryGetValue("SqlDefaultValue", out var values))
        {
            if (values.NewValue == null)
            {
                column.DefaultValueSql = null;

                // Drop Constraint
                var operations = new List<MigrationOperation>
            {
                new SqlOperation(GetSqlDropConstraintQuery(tableName, column.Name))
            };
                Convert(operations);
            }
            else
            {
                column.DefaultValueSql = (string)values.NewValue;
            }
        }
    }

    private void SetAnnotatedColumns(IEnumerable<ColumnModel> columns, string tableName)
    {
        foreach (var column in columns)
        {
            SetAnnotatedColumn(column, tableName);
        }
    }

    private string GetSqlDropConstraintQuery(string tableName, string columnName)
    {
        var tableNameSplitByDot = tableName.Split('.');
        var tableSchema = tableNameSplitByDot[0];
        var tablePureName = tableNameSplitByDot[1];

        var str = $@"DECLARE @var{dropConstraintCount} nvarchar(128)
                SELECT @var{dropConstraintCount} = name
                FROM sys.default_constraints
                WHERE parent_object_id = object_id(N'{tableSchema}.[{tablePureName}]')
                AND col_name(parent_object_id, parent_column_id) = '{columnName}';
                IF @var{dropConstraintCount} IS NOT NULL
                EXECUTE('ALTER TABLE {tableSchema}.[{tablePureName}] DROP CONSTRAINT [' + @var{dropConstraintCount} + ']')";

        dropConstraintCount++;
        return str;
    }
} 

Comments

-1

Even from .NET Core 1.0, It is possible to set default values when you are using the code first approach. See the following code snippet.

using System.ComponentModel;
private bool _myVal = false;

[DefaultValue(true)]
public bool Active
{
    get
    {
        return _myVal;
    }
    set
    {
        _myVal = value;
    }
}

Read for more: Microsoft official docs

1 Comment

Now, check the updated code snippet.
-2

The Entity Framework Core Fluent API HasDefaultValue method is used to specify the default value for a database column mapped to a property. The value must be a constant.

public class Contact
{
    public int ContactId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public bool IsActive { get; set; }
    public DateTime DateCreated { get; set; }
}
public clas SampleContext : DbContext
{
    public DbSet<Contact> Contacts { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Context>()
            .Propery(p => p.IsActive)
            .HasDefaultValue(true);
    }
}

Or

like it!

You can also specify a SQL fragment that is used to calculate the default value:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Created)
        .HasDefaultValueSql("getdate()");
}

1 Comment

Duplicates this answer.
-3

Lets consider you have a class name named Products and you have a IsActive field. just you need a create constructor :

Public class Products
{
    public Products()
    {
       IsActive = true;
    }
 public string Field1 { get; set; }
 public string Field2 { get; set; }
 public bool IsActive { get; set; }
}

Then your IsActive default value is True!

Edite :

if you want to do this with SQL use this command :

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.IsActive)
        .HasDefaultValueSql("true");
}

3 Comments

Simply this wasn't the question. It was about default value constraints in the database itself.
@Hatef, your edit only applies to EF Core. The question is about EF 6.
This HasDefaultValueSql is not available in EF6
-5

Hmm... I do DB first, and in that case, this is actually a lot easier. EF6 right? Just open your model, right click on the column you want to set a default for, choose properties, and you will see a "DefaultValue" field. Just fill that out and save. It will set up the code for you.

Your mileage may vary on code first though, I haven't worked with that.

The problem with a lot of other solutions, is that while they may work initially, as soon as you rebuild the model, it will throw out any custom code you inserted into the machine-generated file.

This method works by adding an extra property to the edmx file:

<EntityType Name="Thingy">
  <Property Name="Iteration" Type="Int32" Nullable="false" **DefaultValue="1"** />

And by adding the necessary code to the constructor:

public Thingy()
{
  this.Iteration = 1;

Comments

-6

Set the default value for the column in table in MSSQL Server, and in class code add attribute, like this:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]

for the same property.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.