43

इकाई फ्रेमवर्क 4, कोड केवल (सीटीपी 3) में, आप पीओसीओ की इकाई कॉन्फ़िगरेशन कक्षा में किसी संपत्ति के लिए डिफ़ॉल्ट मान कैसे सेट करते हैं?ईएफ सीएफ में पीओसीओ के लिए डिफ़ॉल्ट मान कैसे सेट करें?

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public DateTime CreatedOn { get; set; } 
} 

public class PersonConfiguration : EntityConfiguration<Person> 
{ 
    public PersonConfiguration() 
    { 
     Property(p => p.Id).IsIdentity(); 
     Property(p => p.Name).HasMaxLength(100); 

     //set default value for CreatedOn ? 
    } 
} 
+1

कोई भी आश्चर्यचकित होने पर। मैं 'रिपोजिटरी पैटर्न' (http://stackoverflow.com/questions/3175/repository-pattern-tutorial-in-c-sharp) का उपयोग करके समाप्त होता हूं, INSERT के दौरान डिफ़ॉल्ट मान सेट करता हूं। यह एक अच्छा अलगाव है, क्योंकि मैं भविष्य में ईएफ से दूर जाने की सोच रहा हूं। "भविष्य में ईएफ से दूर जाने" के लिए – Andy

+0

+1। बहुत सारे समय बर्बाद हो गए थे, मैं अपने वर्तमान ऐप के लिए सिर्फ एसक्यूएल कोड कर सकता था! लेकिन आप क्या उपयोग करने जा रहे हैं? NHibernate, यह बेहतर है? – Mzn

उत्तर

4

दुर्भाग्यवश आप नहीं कर सकते। http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/a091ccd6-0ba8-4d4f-8f5e-aafabeb258e4

+3

कोड-पहले अभी भी एक सीटीपी है। यदि आप पहले से नहीं हैं, तो कृपया इसके लिए एक कनेक्ट रिपोर्ट लिखें। –

+0

दरअसल मुझे लगता है कि यह एक सक्रिय डिजाइन निर्णय था। डेटाबेस में डिफ़ॉल्ट मान सेट करना केवल कोड से अलग एक प्रकार का कदम है। –

+2

ठीक है, मुझे उम्मीद है कि "कोड केवल" का मतलब है कि कोड में सब कुछ कॉन्फ़िगर किया गया है। डीबी में डिफ़ॉल्ट मान को मैन्युअल रूप से सेट करना एक अच्छा विचार नहीं है, क्योंकि मुझे संदर्भ का उपयोग कर डेटाबेस बनाने के लिए इकाई ढांचे की आवश्यकता है। CreateDatabase() फ़ंक्शन, और मैं वास्तव में कोड और डीबी स्क्रिप्ट दोनों को बनाए रखना नहीं चाहता एक ही समय में। – Andy

15

आप कक्षा के लिए निर्माता के माध्यम से डिफ़ॉल्ट मान सेट कर सकते हैं। इकाई की रूपरेखा 4.3 की रिहाई आप माइग्रेशन के माध्यम से यह कर सकते हैं के साथ

namespace MyProj.Models 
{ 
using System; 
using System.Collections.Generic; 

public partial class Task 
{ 
    public Task() 
    { 
     this.HoursEstimated = 0; 
     this.HoursUsed = 0; 
     this.Status = "To Start"; 
    } 

    public int ID { get; set; } 
    public string Description { get; set; } 
    public int AssignedUserID { get; set; } 
    public int JobID { get; set; } 
    public Nullable<decimal> HoursEstimated { get; set; } 
    public Nullable<decimal> HoursUsed { get; set; } 
    public Nullable<System.DateTime> DateStart { get; set; } 
    public Nullable<System.DateTime> DateDue { get; set; } 
    public string Status { get; set; } 

    public virtual Job Job { get; set; } 
    public virtual User AssignedUser { get; set; } 
} 
} 
+0

मुझे नहीं लगता कि यह आभासी गुणों के साथ अच्छा खेलेंगे, हालांकि ... – Gleno

+11

क्या होगा यदि 'HoursUsed' के लिए डेटाबेस संग्रहीत मूल्य 5.0 है? क्या निर्माता डेटाबेस मान को ओवरराइट करेगा? या यह पहले निर्माण करेगा और फिर वास्तविक मान के साथ डिफ़ॉल्ट 0 को प्रतिस्थापित करेगा? – Benjamin

24

: यहां कक्षा मैं अपने वर्तमान प्रोजेक्ट में है, MVC3 और इकाई की रूपरेखा 4.1 का उपयोग कर रहा है।

EF 4.3 Code First Migrations Walkthrough

तो अपने उदाहरण का उपयोग यह होगा कुछ की तरह:

public partial class AddPersonClass : DbMigration 
{ 
    public override void Up() 
    { 
     CreateTable(
      "People", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        Name = c.String(maxLength: 100), 
        CreatedOn = c.DateTime(nullable: false, defaultValue: DateTime.UtcNow) 
       }) 
      .PrimaryKey(t => t.Id); 
    } 

    public overide void Down() 
    { 
     // Commands for when Migration is brought down 
    } 
} 
+1

क्या आप स्तंभ या तालिका को छोड़कर और पुनर्निर्माण किए बिना डिफ़ॉल्ट मानों को सफलतापूर्वक संशोधित करने के लिए 'AlterColumn' का उपयोग कर सकते हैं? – Benjamin

+3

क्या 'EntityTypeConfiguration' को विस्तारित करने के माध्यम से ऐसा करने का कोई तरीका है? उदाहरण के लिए, GUID के साथ कुछ भी हमेशा 'newsequentialid() 'पर डिफ़ॉल्ट होता है? – drzaus

+0

यदि तालिका कॉलम पहले से मौजूद है तो आप यह कैसे करते हैं? – tofutim

7

मैं जानता हूँ कि इस विषय थोड़ी देर के लिए चल रहा है और मैं एक ही मुद्दा किसी तरह का में चला गया। अब तक मुझे मेरे लिए कोई समाधान नहीं मिला जो पूरी चीज को एक ही स्थान पर रखता है ताकि कोड अभी भी पठनीय हो।

किसी उपयोगकर्ता के निर्माण पर मैं ऑब्जेक्ट द्वारा private setters के माध्यम से कुछ फ़ील्ड सेट करना चाहता हूं, उदा। एक GUID और निर्माण तिथि और कन्स्ट्रक्टर 'प्रदूषण' नहीं।

मेरे उपयोगकर्ता वर्ग:

public class User 
{ 
    public static User Create(Action<User> init) 
    { 
     var user = new User(); 
     user.Guid = Guid.NewGuid(); 
     user.Since = DateTime.Now; 
     init(user); 
     return user; 
    } 

    public int UserID { get; set; } 

    public virtual ICollection<Role> Roles { get; set; } 
    public virtual ICollection<Widget> Widgets { get; set; } 

    [StringLength(50), Required] 
    public string Name { get; set; } 
    [EmailAddress, Required] 
    public string Email { get; set; } 
    [StringLength(255), Required] 
    public string Password { get; set; } 
    [StringLength(16), Required] 
    public string Salt { get; set; } 

    public DateTime Since { get; private set; } 
    public Guid Guid { get; private set; } 
} 

कॉलिंग कोड:

context.Users.Add(User.Create(c=> 
{ 
    c.Name = "Name"; 
    c.Email = "[email protected]"; 
    c.Salt = salt; 
    c.Password = "mypass"; 
    c.Roles = new List<Role> { adminRole, userRole }; 
})); 
+1

दिलचस्प दृष्टिकोण – GibboK

3

मैं एफई किस संस्करण इस उपलब्ध हो जाता है के रूप में यकीन नहीं है, लेकिन यकीन है कि के लिए संस्करण 5 के रूप में आप संभाल कर सकते हैं इस। बस, एसक्यूएल में स्तंभ पर GetDate() का डिफ़ॉल्ट मान सेट या तो TSQL या डिजाइनर में है, तो इस प्रकार सेटअप अपने एफई कक्षाएं:

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public DateTime CreatedOn { get; set; } 
} 

public class PersonConfiguration : EntityConfiguration<Person> 
{ 
    public PersonConfiguration() 
    { 
     Property(p => p.Id).IsIdentity(); 
     Property(p => p.Name).HasMaxLength(100); 

     this.Property(p => p.CreatedOn).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed); 
    } 
} 

ध्यान दें कि आप डेटाबेस स्तंभ नल बनाने के लिए की जरूरत नहीं है , या पीओसीओ संपत्ति।

+1

मुझे लगता है कि बिंदु पहले कोड का उपयोग करते समय ईएफ डिफ़ॉल्ट मान सेट करना है, और एसक्यूएल में नहीं जाना है और उन्हें स्वयं सेट करना है। – Kyle

3

इस मामले में जहां आप चाहते हैं कि SQL सर्वर एक डिफ़ॉल्ट तिथि प्रदान करने के तरीके को आप जिस तरह से पूरा कर सकें, महत्वपूर्ण हिस्सा डिफ़ॉल्ट है ValueSql: "GETDATE()" जो SQL सर्वर डिफ़ॉल्ट सेट करेगा, न केवल उस समय का मूल्यांकन करेगा स्क्रिप्ट चलाने गया था (यानी DateTime.UtcNow)

public partial class AddPersonClass : DbMigration 
    { 
    public override void Up() 
    { 
     CreateTable(
      "People", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        Name = c.String(maxLength: 100), 
        CreatedOn = c.DateTime(nullable: false, defaultValueSql: "GETDATE()") 
       }) 
      .PrimaryKey(t => t.Id); 
    } 

    public overide void Down() 
    { 
     // Commands for when Migration is brought down 
    } 
} 
0

कोई दूसरा रास्ता नहीं है, लेकिन उपयोग करने के लिए डीबी माइग्रेशन और माइग्रेशन सक्षम करने के लिए आप इस

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

और बाद की तरह अपनी संपत्ति सेट करना होगा नहीं है कि एक बार आपका डेटाबेस बनाया गया है, आपको माइग्रेशन को सक्षम करने के लिए निम्न चरणों का पालन करना होगा। जाओ प्रबंधक कंसोल कार्यक्रम और निम्न कमांड एक निष्पादित करने के लिए लोगों को आदेश द्वारा

  • PM> Enable-Migrations
  • PM> Add-Migration AlterMyTable यहाँ AlterMyTable किसी भी नाम हो सकता है। यह आपके समाधान currentTimestamp_AlterMyTable.cs में नए जोड़े गए माइग्रेशन फ़ोल्डर के अंतर्गत एक फ़ाइल पैदा करेगा -अब currentTimestamp_AlterMyTable.cs
  • AlterColumn("Person", "CreatedOn", n => n.DateTime(nullable: false, defaultValueSql: "SYSUTCDATETIME()")); और वह अपने कार्यक्रम प्रबंधक में पिछले आदेश पर अमल के बाद के ऊपर विधि के लिए निम्न कॉपी कंसोल
  • PM> Update-Database और अब यदि आप अपने डेटाबेस में Person तालिका देखते हैं और फिर CreatedOn कॉलम पर नेविगेट करते हैं तो इसे SYSUTCDATETIME() के रूप में डिफ़ॉल्ट मान होना चाहिए यानी यदि आप इस तालिका में कुछ डेटा डालने का प्रयास करते हैं तो आपका डेटाबेस स्वचालित रूप से इस कॉलम को CreatedOn अपडेट करेगा आप।
संबंधित मुद्दे