নির্দিষ্ট সম্পত্তিটিকে একটি ডিফল্ট মান দেওয়ার জন্য কি "মার্জিত" উপায় আছে?
হতে পারে ডেটাঅ্যানোটেশন দ্বারা, এরকম কিছু:
[DefaultValue("true")]
public bool Active { get; set; }
ধন্যবাদ.
public bool Inactive { get; set; }
😉
নির্দিষ্ট সম্পত্তিটিকে একটি ডিফল্ট মান দেওয়ার জন্য কি "মার্জিত" উপায় আছে?
হতে পারে ডেটাঅ্যানোটেশন দ্বারা, এরকম কিছু:
[DefaultValue("true")]
public bool Active { get; set; }
ধন্যবাদ.
public bool Inactive { get; set; }
😉
উত্তর:
আপনি প্রথমে মাইগ্রেশন কোড সম্পাদনা করে এটি করতে পারেন:
public override void Up()
{
AddColumn("dbo.Events", "Active", c => c.Boolean(nullable: false, defaultValue: true));
}
Active
করার true
সময় ওপি বিশেষভাবে সেট না করে তবে এটি কাজ করবে Event
। ডিফল্ট মানটি সর্বদা false
একটি নন-অযোগ্য বিল সম্পত্তিতে থাকে, সুতরাং যদি না পরিবর্তন হয় তবে সত্তা কাঠামোটি ডিবিতে সংরক্ষণ করবে। নাকি আমি কিছু মিস করছি?
এটি একটি সময় হয়েছে, কিন্তু অন্যদের জন্য একটি নোট রেখে। একটি অ্যাট্রিবিউটের সাথে যা প্রয়োজন তা আমি অর্জন করেছি এবং আমি আমার মডেল শ্রেণির ক্ষেত্রগুলিকে আমার যেমন চাই তেমন বৈশিষ্ট্যের সাথে সজ্জিত করেছি।
[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());
[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()"));
উপরের উত্তরগুলি সত্যই সহায়তা করেছে, তবে কেবলমাত্র সমাধানের অংশ সরবরাহ করেছে। প্রধান সমস্যাটি হ'ল আপনি ডিফল্ট মান বৈশিষ্ট্যটি সরিয়ে দেওয়ার সাথে সাথে, ডাটাবেসে কলামের সীমাবদ্ধতা অপসারণ করা হবে না। সুতরাং পূর্ববর্তী ডিফল্ট মানটি এখনও ডাটাবেসে থাকবে।
বৈশিষ্ট্য অপসারণ সম্পর্কিত এসকিউএল সীমাবদ্ধতা অপসারণ সহ সমস্যার একটি সম্পূর্ণ সমাধান এখানে। আমি। নেট ফ্রেমওয়ার্কের নেটিভ DefaultValue
বৈশিষ্ট্যটি পুনরায় ব্যবহার করছি ।
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[DefaultValue("getutcdate()")]
public DateTime CreatedOn { get; set; }
এটি কাজ করার জন্য আপনাকে আইডেন্টিটিমডেলস.সি এবং কনফিগারেশন.সি ফাইলগুলি আপডেট করতে হবে
আপনার 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;
}
}
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
কি এট্রিবিউট সেটটি লাগবে ? যদি তাই হয় তবে কেন? আমার পরীক্ষাগুলিতে মনে হয়েছিল এটি এড়িয়ে যাওয়ার কোনও প্রভাব নেই।
যদিও আপনার মডেল বৈশিষ্ট্যগুলি সহজ তবে এটি 'অটো বৈশিষ্ট্যগুলি' হতে হবে না। এবং ডিফল্টভ্যালু বৈশিষ্ট্যটি কেবলমাত্র তথ্যবহুল মেটাডেটা এখানে গৃহীত উত্তরটি কনস্ট্রাক্টর পদ্ধতির একটি বিকল্প।
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; }
}
এটি কেবলমাত্র এই নির্দিষ্ট বর্গটি ব্যবহার করে ডেটা তৈরি এবং গ্রাস করার জন্য অ্যাপ্লিকেশনগুলির জন্য কাজ করবে। ডেটা অ্যাক্সেস কোডটি কেন্দ্রীভূত করা হলে সাধারণত এটি কোনও সমস্যা নয়। সমস্ত অ্যাপ্লিকেশন জুড়ে মান আপডেট করার জন্য আপনাকে ডিফল্ট মান সেট করতে ডেটা সোর্সটি কনফিগার করতে হবে। দেবীর উত্তরটি দেখায় যে এটি কীভাবে মাইগ্রেশন, স্কয়ার বা আপনার ডেটা সোর্স বলার ভাষা ব্যবহার করে এটি করা যেতে পারে।
আমি যা করেছি, সত্তার নির্মাতায় আমি মানগুলি আরম্ভ করেছি
দ্রষ্টব্য: ডিফল্টভ্যালু বৈশিষ্ট্যগুলি আপনার সম্পত্তিগুলির মানগুলি স্বয়ংক্রিয়ভাবে সেট করে না, আপনাকে এটি নিজেই করতে হবে
@ সিদাতকাপানোগলু মন্তব্যের পরে, আমি আমার সমস্ত পন্থা যুক্ত করছি যা কাজ করে, কারণ তিনি সঠিক ছিলেন, কেবল অনর্গল এপিআই ব্যবহার করা কার্যকর হয় না।
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);
}
ইহা সহজ! প্রয়োজনীয় সাথে সারণি দিন।
[Required]
public bool MyField { get; set; }
ফলস্বরূপ স্থানান্তর হবে:
migrationBuilder.AddColumn<bool>(
name: "MyField",
table: "MyTable",
nullable: false,
defaultValue: false);
আপনি যদি সত্য চান, ডাটাবেস আপডেট করার আগে মাইগ্রেশনে ডিফল্টভ্যালুকে সত্যে পরিবর্তন করুন
true
?
আমি স্বীকার করি যে আমার পদ্ধতির পুরো "কোড ফার্স্ট" ধারণাটি এড়িয়ে গেছে। তবে আপনি যদি কেবল টেবিলে কেবলমাত্র ডিফল্ট মান পরিবর্তন করার ক্ষমতা রাখেন ... উপরের যে দৈর্ঘ্যের মধ্য দিয়ে আপনাকে যেতে হবে এটির চেয়ে এটি অনেক সহজ ... আমি সমস্ত কাজ করতে খুব অলস হয়েছি!
এটি প্রায় মনে হয় পোস্টারগুলির মূল ধারণাটি কাজ করবে:
[DefaultValue(true)]
public bool IsAdmin { get; set; }
আমি ভেবেছিলাম তারা কেবল উদ্ধৃতি যোগ করার ভুল করেছে ... তবে হায় এরকম স্বজ্ঞাততা নেই। অন্যান্য পরামর্শগুলি আমার জন্য খুব বেশি ছিল (মঞ্জুরি দিয়েছি যে আমার কাছে টেবিলে goোকা এবং পরিবর্তনগুলি করার জন্য প্রয়োজনীয় সুযোগগুলি রয়েছে ... যেখানে প্রতিটি বিকাশকারী প্রতিটি পরিস্থিতিতেই তা করে না)। শেষ পর্যন্ত আমি এটি কেবল পুরানো fashionঙেই করেছি। আমি এসকিউএল সার্ভারের টেবিলটিতে ডিফল্ট মান সেট করে দিয়েছি ... আমি বলতে চাইছি ইতিমধ্যে যথেষ্ট! দ্রষ্টব্য: আমি আরও একটি অ্যাড-মাইগ্রেশন এবং আপডেট-ডেটাবেস এবং পরীক্ষাগুলি আটকে পরীক্ষা করেছি।
কেবলমাত্র মডেল শ্রেণীর ডিফল্ট নির্মাতাকে ওভারলোড করুন এবং কোনও প্রাসঙ্গিক পরামিতি পাস করুন যা আপনি ব্যবহার করতে পারেন বা নাও করতে পারেন। এটির মাধ্যমে আপনি সহজেই বৈশিষ্ট্যের জন্য ডিফল্ট মান সরবরাহ করতে পারেন। নীচে একটি উদাহরণ দেওয়া আছে।
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; }
}
}
আপনার পণ্যগুলির নামের একটি শ্রেণীর নাম রয়েছে এবং আপনার একটি ইস্যাক্টিভ ফিল্ড রয়েছে তা বিবেচনা করি। শুধু আপনার একটি তৈরি নির্মাণ প্রয়োজন:
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");
}
27 জুন 2016-এ প্রকাশিত ইএফ কোর-এ আপনি ডিফল্ট মান নির্ধারণের জন্য সাবলীল এপিআই ব্যবহার করতে পারেন। অ্যাপ্লিকেশনবিবি কনটেক্সট ক্লাসে যান, অনমোডেলক্রিয়াটিংয়ের পদ্ধতিটির নামটি সন্ধান করুন / তৈরি করুন এবং নীচের সাবলীল এপিআই যুক্ত করুন।
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<YourTableName>()
.Property(b => b.Active)
.HasDefaultValue(true);
}
নেট কোর 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'.
আমি দেখতে পেয়েছি যে সত্তা সম্পত্তিতে অটো-প্রপার্টি ইনিশিয়ালাইজার ব্যবহার করা কাজটি করার জন্য যথেষ্ট।
উদাহরণ স্বরূপ:
public class Thing {
public bool IsBigThing{ get; set; } = false;
}
হুম ... আমি প্রথমে ডিবি করি, এবং সেক্ষেত্রে এটি আসলে অনেক সহজ। EF6 ঠিক আছে? কেবলমাত্র আপনার মডেলটি খুলুন, আপনি যে কলামটির জন্য ডিফল্ট সেট করতে চান তার ডানদিকে ক্লিক করুন, বৈশিষ্ট্য চয়ন করুন এবং আপনি একটি "ডিফল্টভ্যালু" ক্ষেত্রটি দেখতে পাবেন। শুধু এটি পূরণ করুন এবং সংরক্ষণ করুন। এটি আপনার জন্য কোড সেট আপ করবে।
আপনার মাইলেজ প্রথমে কোডে পরিবর্তিত হতে পারে যদিও আমি এর সাথে কাজ করি নি।
অন্যান্য অনেকগুলি সমাধানের সমস্যা হ'ল এগুলি যে তারা প্রাথমিকভাবে কাজ করতে পারে, আপনি যখন মডেলটি পুনর্নির্মাণ করার সাথে সাথে এটি মেশিন দ্বারা উত্পাদিত ফাইলে intoোকানো কোনও কাস্টম কোড ফেলে দেবে।
এই পদ্ধতিটি এডিএমএক্স ফাইলটিতে একটি অতিরিক্ত সম্পত্তি যুক্ত করে কাজ করে:
<EntityType Name="Thingy">
<Property Name="Iteration" Type="Int32" Nullable="false" **DefaultValue="1"** />
এবং কনস্ট্রাক্টরে প্রয়োজনীয় কোড যুক্ত করে:
public Thingy()
{
this.Iteration = 1;
এমএসএসকিউএল সার্ভারে সারণীতে কলামের জন্য ডিফল্ট মান সেট করুন এবং শ্রেণি কোডটিতে এ জাতীয় বৈশিষ্ট্য যুক্ত করুন:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
একই সম্পত্তি জন্য।
this.Active = true;
? আমি মনে করি যখন আনার সময় ডিবি মান প্রাধান্য লাগবে, কিন্তু সতর্কতা অবলম্বন তাহলে new'ing ছাড়া একটি প্রথম আনা একটি আপডেটের জন্য একটি সত্তা সংযোজনের, যেমন পরিবর্তন ট্র্যাকিং পারে আপনি মান আপডেট অনুপস্থিত হিসাবে এই দেখুন। মন্তব্য করুন কারণ আমি দীর্ঘদিন EF ব্যবহার করি নি, এবং আমার মনে হচ্ছে এটি অন্ধকারের মধ্যে একটি শট।