इकाई फ्रेमवर्क 6 कोड पहले डिफ़ॉल्ट मान


203

क्या विशिष्ट संपत्ति को डिफ़ॉल्ट मान देने का "सुरुचिपूर्ण" तरीका है?

शायद DataAnnotations द्वारा, कुछ इस तरह:

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

धन्यवाद।


शायद कंस्ट्रक्टर में कोशिश करें this.Active = true;? मुझे लगता है कि डी.बी. मूल्य प्राप्त करने के दौरान पूर्वता बरतेंगे, लेकिन सावधान रहें यदि new'ing तो पहले बिना किसी अपडेट के लिए एक इकाई संलग्न कर रहा है, क्योंकि परिवर्तन ट्रैकिंग आप मूल्य को अद्यतन करने के इच्छुक के रूप में देख सकते हैं। टिप्पणी करें क्योंकि मैंने लंबे समय में ईएफ का उपयोग नहीं किया है, और मुझे ऐसा लगता है कि यह अंधेरे में एक शॉट है।
आरोनोल्स

3
प्रतिक्रिया के लिए धन्यवाद, मैंने इस विधि का उपयोग किया है अब तक stackoverflow.com/a/5032578/2913441 लेकिन मैंने सोचा कि शायद एक बेहतर तरीका है।
मारिनो-क्रक

2
public bool Inactive { get; set; }H
जेसी हफस्टेलर

जैसा कि Microsoft डॉक्स कहता है "आप डेटा एनोटेशन का उपयोग करके डिफ़ॉल्ट मान सेट नहीं कर सकते हैं।"
hmfarimani

कृपया
रेफरी

जवाबों:


166

आप इसे मैन्युअल रूप से कोड पहले प्रवास को संपादित करके कर सकते हैं:

public override void Up()
{    
   AddColumn("dbo.Events", "Active", c => c.Boolean(nullable: false, defaultValue: true));
} 

6
मुझे यकीन नहीं है कि यह काम करेगा अगर ओपी विशेष रूप से सेट नहीं करता Activeहै trueजब कोई Eventऑब्जेक्ट बना रहा है । डिफ़ॉल्ट मान हमेशा falseएक अशक्त बूल संपत्ति पर होता है, इसलिए जब तक इसे नहीं बदला जाता है, यह वह है जो इकाई रूपरेखा db में बचाएगा। या क्या मैं कुछ न कुछ भूल रहा हूं?
GFoley83

6
@ GFoley83, हाँ, आप सही हैं। यह विधि केवल डेटाबेस स्तर पर डिफ़ॉल्ट बाधा जोड़ती है। पूर्ण समाधान के लिए आपको इकाई के निर्माता में डिफ़ॉल्ट मान निर्दिष्ट करने या समर्थित फ़ील्ड के साथ संपत्ति का उपयोग करने की आवश्यकता है जैसा कि ऊपर उत्तर में दिखाया गया है
gdbdable

1
यह आधार प्रकारों के लिए काम करता है। DATETIMEOFFSET जैसी किसी चीज़ के लिए, defaultValueSql: "SYSDATETIMEOFFSET" का उपयोग करें, और इस defaultValue के रूप में defaultValue को नहीं: System.DateTimeOffset .Now, वर्तमान सिस्टम डेटाइमऑफ़सेट मान के एक स्ट्रिंग को हल करेगा।
ओजबेक

3
AFAIK माइग्रेशन को फिर से
मचानने के

1
@ मुझे लगता है कि आप इसे पहले डेटाबेस स्तर पर हटाने के लिए माइग्रेशन लिखते हैं, फिर अपनी DAL मैपिंग
gdbdable

74

यह कुछ समय के लिए है, लेकिन दूसरों के लिए एक नोट छोड़ रहा है। मैंने वह हासिल किया है जो एक विशेषता के साथ आवश्यक है और मैंने अपने मॉडल वर्ग के क्षेत्रों को उस विशेषता के साथ सजाया है जैसा मैं चाहता हूं।

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

इन 2 लेखों की मदद ली:

मैंने क्या किया:

गुण को परिभाषित करें

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

संदर्भ के "OnModelCreating" में

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

कस्टम SqlGenerator में

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

फिर माइग्रेशन कॉन्फ़िगरेशन कंस्ट्रक्टर में, कस्टम SQL जनरेटर रजिस्टर करें।

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

6
आप इसे [SqlDefaultValue(DefaultValue = "getutcdate()")]हर संस्था पर लगाए बिना भी विश्व स्तर पर कर सकते हैं । 1) modelBuilder.Conventions.Add( new AttributeToColumnAnnotationConvention<SqlDefaultValueAttribute, string>("SqlDefaultValue", (p, attributes) => attributes.Single().DefaultValue));modelBuilder.Properties().Where(x => x.PropertyType == typeof(DateTime)).Configure(c => c.HasColumnType("datetime2").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).HasColumnAnnotation("SqlDefaultValue", "getdate()"));
सरलता से

1
कृपया कस्टम SqlGenerator कहाँ है?
ᴍᴀᴛᴛ ᴍᴀᴛᴛ

3
कस्टम SqlGenerator यहाँ से आया: andy.mehalick.com/2014/02/06/…
ravinsp

1
@ravinsp SqlGenerator कोड के बजाय सही जानकारी के साथ माइग्रेशनकोडकर्ता श्रेणी को माइग्रेट करने के लिए कस्टमाइज़ क्यों नहीं करता है? एसक्यूएल कोड अंतिम चरण है ...
एलेक्स

@ एलेक्स वर्थ कोशिश कर रहा है! यह भी काम करेगा और SQL कोड इंजेक्ट करने से अधिक सुरुचिपूर्ण होगा। लेकिन मुझे C # MigrationCodeGenerator को ओवरराइड करने की जटिलता के बारे में निश्चित नहीं है।
ravinsp

73

उपरोक्त उत्तर वास्तव में मदद करते हैं, लेकिन केवल समाधान का हिस्सा दिया जाता है। प्रमुख मुद्दा यह है कि जैसे ही आप डिफ़ॉल्ट मान विशेषता को हटाते हैं, डेटाबेस में कॉलम पर बाधा को हटाया नहीं जाएगा। पिछले डिफ़ॉल्ट मान अभी भी डेटाबेस में रहेगा।

यहाँ समस्या का एक पूर्ण समाधान है, जिसमें विशेषता हटाने पर SQL बाधाओं को हटाना शामिल है। मैं .NET फ्रेमवर्क की मूल DefaultValueविशेषता का भी पुन: उपयोग कर रहा हूं ।

प्रयोग

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

इसके लिए आपको IdentityModels.cs और configuration.cs फ़ाइलों को अपडेट करने की आवश्यकता है

IdentityModels.cs फ़ाइल

इस विधि को अपनी ApplicationDbContextकक्षा में जोड़ें / अपडेट करें

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

कॉन्फ़िगरेशन .cs फ़ाइल

Configurationकस्टम वर्ग जनरेटर को पंजीकृत करके अपने वर्ग निर्माता को अपडेट करें , जैसे:

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

इसके बाद, कस्टम Sql जनरेटर वर्ग जोड़ें (आप इसे configuration.cs फ़ाइल या एक अलग फ़ाइल में जोड़ सकते हैं )

internal class DefaultValueSqlServerMigrationSqlGenerator : SqlServerMigrationSqlGenerator
{
    private int dropConstraintCount = 0;

    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)
    {
        AnnotationValues values;
        if (column.Annotations.TryGetValue("SqlDefaultValue", out 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 tableNameSplittedByDot = tableName.Split('.');
        var tableSchema = tableNameSplittedByDot[0];
        var tablePureName = tableNameSplittedByDot[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 = dropConstraintCount + 1;
        return str;
    }
}

2
इस दृष्टिकोण ने मेरे लिए पूरी तरह से काम किया। मैंने जो एक संवर्द्धन किया था वह जेनरेट (CreateTableOperation createTableOperation) को जेनरेट करना था और उसी तर्क के साथ Generate (AddColumnOperation addColumnOperation) उत्पन्न करना था ताकि उन परिदृश्यों को भी पकड़ा जा सके। मैं केवल मानों की जांच करता हूं। NewValue शून्य है क्योंकि मैं चाहता था कि मेरा डिफ़ॉल्ट खाली स्ट्रिंग हो।
डेलोरियन

2
मैं अपने जवाब को अद्यतन किया है @Delorian, आप अपनी टिप्पणी के लिए धन्यवाद
Jevgenij Martynenko

1
मैंने आपके पोस्ट को ऐसे उदाहरणों का समर्थन करने के लिए संपादित किया है जहां एक रोलबैक एक से अधिक बाधाओं को छोड़ रहा है। आपकी स्क्रिप्ट यह बताते हुए एक त्रुटि फेंक देगी कि @con पहले ही घोषित किया गया था। मैंने एक काउंटर बनाने के लिए एक निजी चर बनाया और बस इसे बढ़ाया। मैंने ड्रॉप बाधा के प्रारूप को और अधिक बारीकी से बदल दिया है कि बाधा उत्पन्न करते समय EF SQL को क्या भेजता है। इस पर बढ़िया काम!
ब्रैड

1
समाधान के लिए धन्यवाद, लेकिन मुझे दो समस्याएं हैं: 1. तालिका के नाम को कोष्ठक की आवश्यकता है। 2. अपडेट में नया मान सेट नहीं किया गया है और इसके बजाय डिफ़ॉल्ट मान सेट किया गया है!
ओमिड-आरएच

1
क्या मुझे सेट की [DatabaseGenerated(DatabaseGeneratedOption.Computed)]विशेषता चाहिए? यदि हां, तो क्यों? मेरे परीक्षणों में इसे छोड़ने का कोई प्रभाव नहीं था।
रामनौ

26

आपके मॉडल के गुणों को 'ऑटो गुण' होना जरूरी नहीं है, हालांकि यह आसान है। और DefaultValue विशेषता वास्तव में केवल जानकारीपूर्ण मेटाडेटा है। यहां स्वीकार किया गया उत्तर कंस्ट्रक्टर दृष्टिकोण का एक विकल्प है।

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

बनाम

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

    public int LengthInMeters { get; set; }        
}

यह केवल इस विशिष्ट वर्ग का उपयोग करके डेटा बनाने और उपभोग करने वाले अनुप्रयोगों के लिए काम करेगा। यदि डेटा एक्सेस कोड केंद्रीकृत है तो आमतौर पर यह कोई समस्या नहीं है। सभी अनुप्रयोगों में मूल्य को अपडेट करने के लिए आपको डिफ़ॉल्ट मान सेट करने के लिए डेटा स्रोत कॉन्फ़िगर करना होगा। देवी का उत्तर बताता है कि यह कैसे किया जा सकता है जो माइग्रेशन, एसक्यूएल, या आपके डेटा स्रोत से जो भी भाषा बोलती है।


21
नोट: यह डेटाबेस में एक डिफ़ॉल्ट मान सेट नहीं करेगा । आपकी इकाई का उपयोग नहीं करने वाले अन्य कार्यक्रमों को वह डिफ़ॉल्ट मान नहीं मिलेगा।
एरिक जे।

यह उत्तर का हिस्सा है, लेकिन यह काम नहीं करता है यदि आप एंटिटी फ्रेमवर्क के अलावा अन्य तरीकों से रिकॉर्ड डाल रहे हैं। इसके अलावा, यदि आप एक मेज पर एक नया गैर-नल स्तंभ बना रहे हैं, तो यह आपको मौजूदा रिकॉर्ड के लिए डिफ़ॉल्ट मान सेट करने की क्षमता नहीं देगा। @ देवी के नीचे एक मूल्यवान जोड़ है।
d512

आपका पहला तरीका "सही" तरीका क्यों है? क्या आप कंस्ट्रक्टर दृष्टिकोण के साथ अनपेक्षित मुद्दों में भाग लेंगे?
वाइटकैसल

राय की बात है, और वे बदल जाते हैं :) और शायद नहीं।
calebboyd

2
कुछ परिस्थितियों में, मेरे पास कंस्ट्रक्टर दृष्टिकोण के साथ समस्याएं हैं; बैकिंग फ़ील्ड में डिफ़ॉल्ट मान सेट करना कम से कम इनवेसिव समाधान लगता है।
लूसेंट फॉक्स

11

मैंने जो भी किया, मैंने इकाई के निर्माता में मूल्यों को इनिशियलाइज़ किया

नोट: DefaultValue विशेषताएँ आपके गुणों के मूल्यों को स्वचालित रूप से सेट नहीं करेंगी, आपको इसे स्वयं करना होगा


4
मूल्य निर्धारित करने वाले निर्माणकर्ता के साथ समस्या यह है कि लेनदेन करते समय EF डेटाबेस को अपडेट करेगा।
लुका

मॉडल पहले डिफ़ॉल्ट मानों को इस तरह से क्रेट करता है
लुकास

DefaultValue एक ऐसी प्रजाति है जो बहुत दूर, विदेशी भूमि में रहती है, अपने गुणों से खुद को बचाने के लिए बहुत शर्माती है। ध्वनि न करें, यह आसानी से दूर हो जाता है - क्या इसे सुनने के लिए पर्याप्त पास आना चाहिए। +1 स्पष्ट नहीं है।
रिसादिंह

8

@SedatKapanoglu टिप्पणी के बाद, मैं अपने सभी दृष्टिकोण को जोड़ रहा हूं जो काम करता है, क्योंकि वह सही था, बस धाराप्रवाह एपीआई का उपयोग करने से काम नहीं होता है।

1- कस्टम कोड जनरेटर बनाएँ और एक 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- नए कोड जनरेटर को असाइन करें:

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

3- एनोटेशन बनाने के लिए धाराप्रवाह एपी का उपयोग करें:

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

कृपया मेरा पूरा समाधान देख सकते हैं, मैंने अपने सभी कार्यान्वयन को जोड़ा कि यह कैसे काम करता है, धन्यवाद।
डेनी पुइग

5

यह आसान है! बस आवश्यकता के साथ एनोटेट करें।

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

परिणामी प्रवास होगा:

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

यदि आप सही चाहते हैं, तो डेटाबेस को अपडेट करने से पहले डिफ़ॉल्टवैल्यू को माइग्रेशन में सच में बदलें


ऑटोजेनरेटेड माइग्रेशन को तब बदला जा सकता है और आप डिफाल्टव्यू के बारे में भूल जाएंगे
फर्नांडो टॉरेस

सरल और काम करता है, नए स्तंभ पर एक विदेशी कुंजी बाधा के साथ एक मौजूदा तालिका में एक स्तंभ को जल्दी से जोड़ने में मदद करता है। धन्यवाद
po10cySA

और अगर हमें डिफ़ॉल्ट मान की आवश्यकता है तो क्या होगा true?
क्रिस्टोस लिट्रास

5

मैं स्वीकार करता हूं कि मेरा दृष्टिकोण संपूर्ण "कोड फर्स्ट" अवधारणा से बच जाता है। लेकिन अगर आपके पास केवल तालिका में डिफ़ॉल्ट मान को बदलने की क्षमता है ... यह उन लंबाई की तुलना में बहुत सरल है जिन्हें आपको ऊपर से गुजरना पड़ता है ... मैं बस उस काम को करने के लिए बहुत आलसी हूं!

यह लगभग ऐसा लगता है जैसे कि पोस्टर मूल विचार काम करेगा:

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

मुझे लगा कि उन्होंने सिर्फ उद्धरण जोड़ने की गलती की है ... लेकिन अफसोस ऐसी कोई बात नहीं है। अन्य सुझाव मेरे लिए बहुत अधिक थे (मुझे दी गई जानकारी के लिए मेज पर जाने और बदलाव करने की आवश्यकता है ... जहां हर डेवलपर हर स्थिति में नहीं होगा)। अंत में मैंने बस इसे पुराने तरीके से किया। मैंने SQL सर्वर तालिका में डिफ़ॉल्ट मान सेट किया है ... मेरा मतलब है कि वास्तव में, पहले से ही पर्याप्त है! ध्यान दें: मैंने आगे एक ऐड-माइग्रेशन और अपडेट-डेटाबेस का परीक्षण किया और परिवर्तन अटक गए। यहां छवि विवरण दर्ज करें


1

बस मॉडल क्लास के डिफॉल्ट कंस्ट्रक्टर को ओवरलोड करें और कोई भी प्रासंगिक पैरामीटर पास करें जो आप उपयोग कर सकते हैं या नहीं। इसके द्वारा आप आसानी से विशेषताओं के लिए डिफ़ॉल्ट मानों की आपूर्ति कर सकते हैं। नीचे एक उदाहरण है।

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

}

यह सुझाव पूरी तरह से क्लाइंट साइड लॉजिक है। यह "काम करता है" जब तक आप केवल डेटाबेस के साथ आवेदन का उपयोग करके बातचीत करेंगे। जैसे ही कोई व्यक्ति मैन्युअल रूप से या किसी अन्य एप्लिकेशन से रिकॉर्ड सम्मिलित करना चाहता है, आपको यह महसूस होता है कि स्कीमा में कोई डिफ़ॉल्ट अभिव्यक्ति नहीं है और यह अन्य ग्राहकों के लिए पैमाने पर नहीं हो सकता है। हालांकि यह स्पष्ट रूप से नहीं कहा गया था, इस वैध विषय से तात्पर्य है कि एक डिफ़ॉल्ट अभिव्यक्ति को स्तंभ परिभाषा में रखने वाले माइग्रेशन को बनाने के लिए EF प्राप्त करना आवश्यक है।
टॉम

0

आइए विचार करें कि आपके पास उत्पाद नाम का एक वर्ग नाम है और आपके पास एक IsActive फ़ील्ड है। बस आपको एक निर्माणकर्ता की आवश्यकता है:

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

तब आपका IsActive डिफ़ॉल्ट मान True होता है!

संपादन :

यदि आप SQL के साथ इस कमांड का उपयोग करना चाहते हैं:

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

बस यह सवाल नहीं था। यह डेटाबेस में ही डिफ़ॉल्ट मान की कमी के बारे में था।
गैबोर

4
@Hatef, आपका संपादन केवल EF Core पर लागू होता है। प्रश्न EF 6.
माइकल

3
यह HasDefaultValueSql EF6
tatigo

0

27 जून 2016 को जारी ईएफ कोर में आप डिफॉल्ट वैल्यू सेट करने के लिए धाराप्रवाह एपीआई का उपयोग कर सकते हैं। ApplicationDbContext क्लास में जाएं, OnModelCreating विधि नाम खोजें / बनाएं और निम्न धाराप्रवाह एपीआई जोड़ें।

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

0

.NET कोर 3.1 में आप मॉडल वर्ग में निम्नलिखित कर सकते हैं:

    public bool? Active { get; set; } 

DbContext OnModelCreating में आप डिफ़ॉल्ट मान जोड़ते हैं।

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

        base.OnModelCreating(modelBuilder);
    }

डेटाबेस में निम्नलिखित में परिणाम

यहां छवि विवरण दर्ज करें

नोट: यदि आपके पास संपत्ति के लिए अशक्त (बूल?) नहीं है, तो आपको निम्नलिखित चेतावनी मिलेगी

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'.

-3

मैंने पाया कि बस प्रॉपर्टी पर ऑटो-प्रॉपर्टी इनिशियलाइज़र का उपयोग करना काम पाने के लिए पर्याप्त है।

उदाहरण के लिए:

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

2
आपको लगता है कि यह काम करेगा, पहले कोड के साथ। लेकिन यह मेरे लिए EF 6.2 के साथ नहीं था।
user1040323

-4

हम्म ... मैं पहले डीबी करता हूं, और उस मामले में, यह वास्तव में बहुत आसान है। EF6 सही है? बस अपना मॉडल खोलें, उस कॉलम पर राइट क्लिक करें जिसके लिए आप डिफ़ॉल्ट सेट करना चाहते हैं, गुण चुनें, और आपको एक "डिफ़ॉल्ट" फ़ील्ड दिखाई देगा। बस उसे भरें और बचाएं। यह आपके लिए कोड सेट करेगा।

आपका माइलेज पहले कोड पर अलग-अलग हो सकता है, हालांकि मैंने उसके साथ काम नहीं किया है।

कई अन्य समाधानों के साथ समस्या यह है कि जब वे शुरू में काम कर सकते हैं, जैसे ही आप मॉडल का पुनर्निर्माण करते हैं, तो यह आपके द्वारा मशीन-जनरेटेड फ़ाइल में डाला गया कोई भी कस्टम कोड निकाल देगा।

यह विधि edmx फ़ाइल में एक अतिरिक्त गुण जोड़कर काम करती है:

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

और निर्माणकर्ता को आवश्यक कोड जोड़कर:

public Thingy()
{
  this.Iteration = 1;

-5

MSSQL सर्वर में तालिका में स्तंभ के लिए डिफ़ॉल्ट मान सेट करें, और वर्ग कोड में इस तरह से विशेषता जोड़ें:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]

उसी संपत्ति के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.