সত্তা ফ্রেমওয়ার্ক 6 কোড প্রথম ডিফল্ট মান


203

নির্দিষ্ট সম্পত্তিটিকে একটি ডিফল্ট মান দেওয়ার জন্য কি "মার্জিত" উপায় আছে?

হতে পারে ডেটাঅ্যানোটেশন দ্বারা, এরকম কিছু:

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

ধন্যবাদ.


কন্সট্রাক্টর চেষ্টা করতে পারেন this.Active = true;? আমি মনে করি যখন আনার সময় ডিবি মান প্রাধান্য লাগবে, কিন্তু সতর্কতা অবলম্বন তাহলে new'ing ছাড়া একটি প্রথম আনা একটি আপডেটের জন্য একটি সত্তা সংযোজনের, যেমন পরিবর্তন ট্র্যাকিং পারে আপনি মান আপডেট অনুপস্থিত হিসাবে এই দেখুন। মন্তব্য করুন কারণ আমি দীর্ঘদিন EF ব্যবহার করি নি, এবং আমার মনে হচ্ছে এটি অন্ধকারের মধ্যে একটি শট।
অ্যারোনএলএস

3
প্রতিক্রিয়াটির জন্য আপনাকে ধন্যবাদ, আমি এখন পর্যন্ত এই পদ্ধতিটি ব্যবহার করেছি stackoverflow.com/a/5032578/2913441 তবে আমি ভেবেছিলাম যে আরও ভাল উপায় আছে।
মেরিনো- krk

2
public bool Inactive { get; set; }😉
জেসি হাফস্টিলার

মাইক্রোসফ্ট ডকস হিসাবে "আপনি ডেটা টিকা ব্যবহার করে কোনও ডিফল্ট মান সেট করতে পারবেন না।"
hmfarimani

উত্তর:


166

আপনি প্রথমে মাইগ্রেশন কোড সম্পাদনা করে এটি করতে পারেন:

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

6
আমি নিশ্চিত না যে যদি কোনও বস্তু তৈরি Activeকরার trueসময় ওপি বিশেষভাবে সেট না করে তবে এটি কাজ করবে Event। ডিফল্ট মানটি সর্বদা falseএকটি নন-অযোগ্য বিল সম্পত্তিতে থাকে, সুতরাং যদি না পরিবর্তন হয় তবে সত্তা কাঠামোটি ডিবিতে সংরক্ষণ করবে। নাকি আমি কিছু মিস করছি?
জিএফলে 83

6
@ জিএফলে ৩৩, হ্যাঁ, আপনি ঠিক বলেছেন। এই পদ্ধতিটি কেবল ডাটাবেস স্তরে ডিফল্ট সীমাবদ্ধতা যুক্ত করে। সম্পূর্ণ সমাধানের জন্য আপনাকে সত্তা
নির্মাত্রে

1
এটি বেস ধরণের জন্য কাজ করে। DATETIMEOFFSET এর মতো কোনও কিছুর জন্য, ডিফল্টভ্যালিউএসকিউএল: "SYSDATETIMEOFFSET" ব্যবহার করুন, এবং এই ডিফল্ট মান হিসাবে ডিফল্ট মান নয়: System.DateTimeOffset.Now, বর্তমান সিস্টেমের ডেটটাইমসেট মানটির একটি স্ট্রিং সমাধান করবে।
ওজব্বি

3
আফ্রিক আপনার ম্যানুয়াল পরিবর্তনগুলি
হস্তান্তর

1
@ নিবিট আমার মনে হয় আপনি প্রথমে এটি ডাটাবেস পর্যায়ে সরিয়ে নিতে মাইগ্রেশন লিখতে হবে, তারপরে আপনার ডালের ম্যাপিং
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; }
}

প্রসঙ্গে "অনমোডেলক্রিয়াটিং" তে

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

কাস্টম স্কেল জেনারেটরে

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

তারপরে মাইগ্রেশন কনফিগারেশন কনস্ট্রাক্টারে কাস্টম এসকিউএল জেনারেটরটি নিবন্ধ করুন।

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

6
এমনকি আপনি [SqlDefaultValue(DefaultValue = "getutcdate()")]প্রতিটি সত্তা না রেখে বিশ্বব্যাপী এটি করতে পারেন । 1) সহজভাবে সরান modelBuilder.Conventions.Add( new AttributeToColumnAnnotationConvention<SqlDefaultValueAttribute, string>("SqlDefaultValue", (p, attributes) => attributes.Single().DefaultValue)); 2) অ্যাড করুনmodelBuilder.Properties().Where(x => x.PropertyType == typeof(DateTime)).Configure(c => c.HasColumnType("datetime2").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).HasColumnAnnotation("SqlDefaultValue", "getdate()"));
ড্যানিয়েল স্কোরোস্কি

1
দয়া করে কাস্টম স্কেল জেনারেটরটি কোথায়?
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

3
কাস্টম স্কেল জেনারেটর এখান থেকে এসেছেন: andy.mehalick.com/2014/02/06/…
রেভিনস্প

1
@ রেভিনস্প মাইগ্রেশনকডজেনারেটর ক্লাসটি স্কেল জেনারেটর কোডের পরিবর্তে সঠিক তথ্য সহ স্থানান্তর করতে কাস্টমাইজ করবেন না কেন? এসকিউএল কোড হ'ল শেষ পদক্ষেপ ...
অ্যালেক্স

অ্যালেক্স ওয়ার্থ চেষ্টা করছে! এটি কাজ করবে এবং এসকিউএল কোড ইনজেকশন দেওয়ার চেয়ে আরও মার্জিত হবে। তবে আমি সি # মাইগ্রেশনকোডজেনেটরকে ওভাররাইড করার জটিলতা সম্পর্কে নিশ্চিত নই।
রাভিংস্প

73

উপরের উত্তরগুলি সত্যই সহায়তা করেছে, তবে কেবলমাত্র সমাধানের অংশ সরবরাহ করেছে। প্রধান সমস্যাটি হ'ল আপনি ডিফল্ট মান বৈশিষ্ট্যটি সরিয়ে দেওয়ার সাথে সাথে, ডাটাবেসে কলামের সীমাবদ্ধতা অপসারণ করা হবে না। সুতরাং পূর্ববর্তী ডিফল্ট মানটি এখনও ডাটাবেসে থাকবে।

বৈশিষ্ট্য অপসারণ সম্পর্কিত এসকিউএল সীমাবদ্ধতা অপসারণ সহ সমস্যার একটি সম্পূর্ণ সমাধান এখানে। আমি। নেট ফ্রেমওয়ার্কের নেটিভ DefaultValueবৈশিষ্ট্যটি পুনরায় ব্যবহার করছি ।

ব্যবহার

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

এটি কাজ করার জন্য আপনাকে আইডেন্টিটিমডেলস.সি এবং কনফিগারেশন.সি ফাইলগুলি আপডেট করতে হবে

IdentityModels.cs ফাইল .c

আপনার 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);
}

কনফিগারেশন। ফাইল ফাইল

Configurationকাস্টম এসকিএল জেনারেটরটি রেজিস্টার করে আপনার শ্রেণি নির্মাতা আপডেট করুন :

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

এর পরে, কাস্টম এসকিএল জেনারেটর শ্রেণি যুক্ত করুন (আপনি এটি কনফিগারেশনসি ফাইল বা একটি পৃথক ফাইলে যুক্ত করতে পারেন )

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
এই পদ্ধতির আমার জন্য নিখুঁতভাবে কাজ করে। আমি যে একটি বর্ধন করেছি তা হ'ল জেনারেট (ক্রিয়েটবেলপ্রেশন ক্রিয়েটবেলপেশন) এবং একই যুক্তি দিয়ে জেনারেট (অ্যাডক্লামওনপ্রেশন অ্যাডক্লোমেনপ্রেশন) যাতে এই পরিস্থিতিতেও ধরা পড়ে। আমি কেবল মানগুলিও পরীক্ষা করি e
দেলোরিয়ান

2
@ ডেলোরিয়ান আমি আমার উত্তর আপডেট করেছি, আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ
জেভেনিজ মার্টিনেঙ্কো

1
রোলব্যাক একাধিক বাধা ছাড়ছে এমন দৃষ্টান্তগুলি সমর্থন করার জন্য আমি আপনার পোস্টে একটি সম্পাদনা করেছি। আপনার স্ক্রিপ্টটি এমন একটি ত্রুটি ছুঁড়ে মারবে যা জানিয়েছে যে @ আইকনটি ইতিমধ্যে ঘোষিত হয়েছিল। আমি একটি কাউন্টার ধরে রাখতে এবং এটি বৃদ্ধি করার জন্য একটি ব্যক্তিগত ভেরিয়েবল তৈরি করেছি। আমি ড্রপ সীমাবদ্ধতার ফর্ম্যাটটিকে আরও সান্নিধ্যে পরিবর্তন করতে পেরেছি যাতে সীমাবদ্ধতা তৈরি করার সময় এসএফকিএলে EF কী পাঠায়। এ নিয়ে দুর্দান্ত কাজ!
ব্র্যাড

1
সমাধানের জন্য ধন্যবাদ তবে আমার দুটি সমস্যা আছে: ১. টেবিলের নামগুলির বন্ধনী দরকার। ২. আপডেটে নতুন মান সেট করা হয়নি এবং পরিবর্তে ডিফল্ট মান সেট করা হয়!
ওমিড-আরএইচ

1
আমার [DatabaseGenerated(DatabaseGeneratedOption.Computed)]কি এট্রিবিউট সেটটি লাগবে ? যদি তাই হয় তবে কেন? আমার পরীক্ষাগুলিতে মনে হয়েছিল এটি এড়িয়ে যাওয়ার কোনও প্রভাব নেই।
রামনো

26

যদিও আপনার মডেল বৈশিষ্ট্যগুলি সহজ তবে এটি 'অটো বৈশিষ্ট্যগুলি' হতে হবে না। এবং ডিফল্টভ্যালু বৈশিষ্ট্যটি কেবলমাত্র তথ্যবহুল মেটাডেটা এখানে গৃহীত উত্তরটি কনস্ট্রাক্টর পদ্ধতির একটি বিকল্প।

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

আপনার প্রথম পদ্ধতির কেন "সঠিক" উপায়? আপনি কি কনস্ট্রাক্টর পদ্ধতির সাথে অযৌক্তিক সমস্যাগুলিতে চলে যাবেন?
WiteCastle

মতামত একটি বিষয়, এবং যারা পরিবর্তন :) এবং সম্ভবত না।
কালেবয়ড ২

2
নির্দিষ্ট পরিস্থিতিতে কন্সট্রাক্টর পদ্ধতির সাথে আমার সমস্যা হয়েছিল; ব্যাকিং ফিল্ডে একটি ডিফল্ট মান নির্ধারণ করা সবচেয়ে কম আক্রমণাত্মক সমাধান বলে মনে হয়।
লুক্সেন্ট ফক্স

11

আমি যা করেছি, সত্তার নির্মাতায় আমি মানগুলি আরম্ভ করেছি

দ্রষ্টব্য: ডিফল্টভ্যালু বৈশিষ্ট্যগুলি আপনার সম্পত্তিগুলির মানগুলি স্বয়ংক্রিয়ভাবে সেট করে না, আপনাকে এটি নিজেই করতে হবে


4
কনস্ট্রাক্টরকে মান নির্ধারণের ক্ষেত্রে সমস্যাটি হ'ল লেনদেন করার সময় EF ডাটাবেসটিতে একটি আপডেট করবে।
লুকা

মডেলটি এইভাবে প্রথমে ডিফল্ট মানগুলি তৈরি করে
লুকাস

ডিফল্টভ্যালু এমন একটি প্রজাতি যা দূরের দেশ, বিদেশের দেশগুলিতে বাস করে এবং নিজেই নিজের সম্পত্তিগুলির মুখোমুখি হতে লজ্জা পায়। কোনও শব্দ করবেন না, এটি সহজেই দূরে সরে যায় - এটি কখনই শুনতে পারা উচিতের কাছাকাছি আসা উচিত। মোটামুটি সুস্পষ্ট নয় বলে উল্লেখ করার জন্য +1।
রিসাদিনহা

8

@ সিদাতকাপানোগলু মন্তব্যের পরে, আমি আমার সমস্ত পন্থা যুক্ত করছি যা কাজ করে, কারণ তিনি সঠিক ছিলেন, কেবল অনর্গল এপিআই ব্যবহার করা কার্যকর হয় না।

1- কাস্টম কোড জেনারেটর তৈরি করুন এবং একটি কলামোমডেলের জন্য ওভাররাইড জেনারেট করুন।

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

আমি ভেবেছিলাম তারা কেবল উদ্ধৃতি যোগ করার ভুল করেছে ... তবে হায় এরকম স্বজ্ঞাততা নেই। অন্যান্য পরামর্শগুলি আমার জন্য খুব বেশি ছিল (মঞ্জুরি দিয়েছি যে আমার কাছে টেবিলে goোকা এবং পরিবর্তনগুলি করার জন্য প্রয়োজনীয় সুযোগগুলি রয়েছে ... যেখানে প্রতিটি বিকাশকারী প্রতিটি পরিস্থিতিতেই তা করে না)। শেষ পর্যন্ত আমি এটি কেবল পুরানো fashionঙেই করেছি। আমি এসকিউএল সার্ভারের টেবিলটিতে ডিফল্ট মান সেট করে দিয়েছি ... আমি বলতে চাইছি ইতিমধ্যে যথেষ্ট! দ্রষ্টব্য: আমি আরও একটি অ্যাড-মাইগ্রেশন এবং আপডেট-ডেটাবেস এবং পরীক্ষাগুলি আটকে পরীক্ষা করেছি। এখানে চিত্র বর্ণনা লিখুন


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

আপনার পণ্যগুলির নামের একটি শ্রেণীর নাম রয়েছে এবং আপনার একটি ইস্যাক্টিভ ফিল্ড রয়েছে তা বিবেচনা করি। শুধু আপনার একটি তৈরি নির্মাণ প্রয়োজন:

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

তাহলে আপনার ইস্যাকটিভ ডিফল্ট মানটি সত্য!

Edite :

আপনি যদি এসকিউএল দিয়ে এটি করতে চান তবে এই আদেশটিটি ব্যবহার করুন:

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

কেবল এই প্রশ্ন ছিল না। এটি ডাটাবেসে নিজেই ডিফল্ট মান সীমাবদ্ধতা সম্পর্কে ছিল।
গ্যাবার

4
@ হাটফ, আপনার সম্পাদনাটি কেবল ইএফ কোরের জন্য প্রযোজ্য। প্রশ্নটি EF 6 সম্পর্কে
মাইকেল

3
এই HasDefaultValueSql EF6
টাতিগো

0

27 জুন 2016-এ প্রকাশিত ইএফ কোর-এ আপনি ডিফল্ট মান নির্ধারণের জন্য সাবলীল এপিআই ব্যবহার করতে পারেন। অ্যাপ্লিকেশনবিবি কনটেক্সট ক্লাসে যান, অনমোডেলক্রিয়াটিংয়ের পদ্ধতিটির নামটি সন্ধান করুন / তৈরি করুন এবং নীচের সাবলীল এপিআই যুক্ত করুন।

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

0

নেট কোর 3.1 এ আপনি মডেল শ্রেণিতে নিম্নলিখিতটি করতে পারেন:

    public bool? Active { get; set; } 

DbContext OnModelCreting এ আপনি ডিফল্ট মান যোগ করেন।

    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 এর সাথে আমার পক্ষে হয়নি।
ব্যবহারকারী 1040323

-4

হুম ... আমি প্রথমে ডিবি করি, এবং সেক্ষেত্রে এটি আসলে অনেক সহজ। EF6 ঠিক আছে? কেবলমাত্র আপনার মডেলটি খুলুন, আপনি যে কলামটির জন্য ডিফল্ট সেট করতে চান তার ডানদিকে ক্লিক করুন, বৈশিষ্ট্য চয়ন করুন এবং আপনি একটি "ডিফল্টভ্যালু" ক্ষেত্রটি দেখতে পাবেন। শুধু এটি পূরণ করুন এবং সংরক্ষণ করুন। এটি আপনার জন্য কোড সেট আপ করবে।

আপনার মাইলেজ প্রথমে কোডে পরিবর্তিত হতে পারে যদিও আমি এর সাথে কাজ করি নি।

অন্যান্য অনেকগুলি সমাধানের সমস্যা হ'ল এগুলি যে তারা প্রাথমিকভাবে কাজ করতে পারে, আপনি যখন মডেলটি পুনর্নির্মাণ করার সাথে সাথে এটি মেশিন দ্বারা উত্পাদিত ফাইলে intoোকানো কোনও কাস্টম কোড ফেলে দেবে।

এই পদ্ধতিটি এডিএমএক্স ফাইলটিতে একটি অতিরিক্ত সম্পত্তি যুক্ত করে কাজ করে:

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

এবং কনস্ট্রাক্টরে প্রয়োজনীয় কোড যুক্ত করে:

public Thingy()
{
  this.Iteration = 1;

-5

এমএসএসকিউএল সার্ভারে সারণীতে কলামের জন্য ডিফল্ট মান সেট করুন এবং শ্রেণি কোডটিতে এ জাতীয় বৈশিষ্ট্য যুক্ত করুন:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]

একই সম্পত্তি জন্য।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.