मैं दो डीबीकॉन्टेक्स्ट में एक ही इकाई का उपयोग करता हूं।

public class ActualDbContext : DbContext
{
    public DbSet<Doc> Docs { get; set; }
}

public class ArchivedDbContext : DbContext
{
    public DbSet<Doc> Docs { get; set; }
}

public class Doc
{
    ...
}

मैं इस इकाई में एक अनदेखा फ़ील्ड कैसे जोड़ सकता हूं, लेकिन इसे DbContext से भर सकता हूं?

public class Doc
{
    ...
    public bool IsArchived {get;set;}
}

public class ActualDbContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder builder)
    {

        builder.Entity<Doc>(entity =>
        {
            entity
                .Ignore(x => x.IsArchived)
                .WithValue(x => false);        // ??
        };
    }
}


public class ArchivedDbContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Doc>(entity =>
        {
            entity
                .Ignore(x => x.IsArchived)
                .WithValue(x => true);        // ??
        };
    }
}

डेटाबेस से डेटा पढ़ते समय, इस गुण को भरना होगा। प्रोग्राम कोड में, मैं कोड को डुप्लिकेट करने से बचना चाहता हूं। मुझे इन संस्थाओं के साथ उसी तरह काम करने की ज़रूरत है। इस संपत्ति के अपवाद के साथ। मैं यह कैसे कर सकता हूँ ?

@ali आपका मतलब कुछ ऐसा ही है ?

class MyRepo: IRepo
{
    private bool _isArchived;

    public MyRepo (MyContext context, bool isArchived)
    {
        _context = context;
       _isArchived = isArchived;
    }

    public IQueryable<Doc> GetData (...)
    {
        return _mainDbContext.Docs.Where(....)
            .Select (x=> new Doc 
            {
                Id = x.Id,
                IsArchived = _isArchived 
            });
    }

}

मुझे वास्तव में यह निर्णय पसंद नहीं है।

1
Michael Zagorski 30 मार्च 2020, 13:34

2 जवाब

तो, आप इसके आधार वर्ग पर onmodelcreating को ओवरराइड करके ऐसा कर सकते हैं।

public class ActualDbContext : DbContext
{
    public ActualDbContext (DbContextOptions<ActualDbContext > options) : base(options)
    {
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Doc>().Ignore(t => t.IsArchived);
        base.OnModelCreating(modelBuilder);
    }
    public DbSet<Doc> Docs { get; set; }
}

अधिक स्पष्टीकरण के लिए इस उत्तर की जाँच करें => ignoring- ए-क्लास-प्रॉपर्टी-इन-एंटिटी

शुभ दिन

0
Pritom 30 मार्च 2020, 14:23
मेरा सवाल कुछ और है। अनदेखा फ़ील्ड को कॉन्फ़िगर करने के तरीके के बारे में नहीं। यह इस बारे में है कि इसे संदर्भ में कैसे भरना है।
 – 
Michael Zagorski
30 मार्च 2020, 14:29
मैं आपके प्रश्न को लेकर भ्रमित हूं। यदि आप अपनी इच्छा का मूल्य भरना चाहते हैं तो आप किसी संपत्ति की उपेक्षा क्यों करना चाहते हैं? यदि आप इसे अनदेखा करते हैं, तो इससे कोई फर्क नहीं पड़ता कि आप क्या भरते हैं। जब आप डीबी से अपना मूल्य प्राप्त करेंगे तो यह गिनती नहीं होगी। अधिकार ?
 – 
Pritom
30 मार्च 2020, 15:29
प्रोग्राम कोड में, मैं अंतर की कुछ पंक्तियों को छोड़कर, समान रूप से संग्रहीत और वर्तमान दस्तावेज़ों को संसाधित करता हूं। मुझे यह दिखाना है कि रिकॉर्ड संग्रहीत या वास्तविक है।
 – 
Michael Zagorski
30 मार्च 2020, 16:08
ठीक है, तो आप अपने सभी दस्तावेज़ दिखाना चाहते हैं क्या संग्रहीत स्थिति सत्य है? मुझे यह समझने में मदद करें कि आप क्या दिखाना चाहते हैं और आपकी वर्तमान डीबी स्थिति क्या है।
 – 
Pritom
30 मार्च 2020, 16:41

एफई कोर आर्किटेक्चर के आधार पर, ऐसा करना असंभव है। मेरा सुझाव है कि डेटा लाते समय रिपोजिटरी पैटर्न का उपयोग करें और अपनी संस्थाओं के लिए डिफ़ॉल्ट मान सेट करें।

Class MyRepo: IRepo
{
    private ActualDbContext _mainDbContext;
    private ArchivedDbContext _archivedContext;
    public MyRepo (ActualDbContext context , ArchivedDbContext archivedContext)
    {
        _mainDbContext = context;
        _archivedContext = archivedContext;
    }
    public IQueryable<Doc> GetMainData (...)
    {
        return _mainDbContext.Docs.Where(....)
            .Select (x=> new Doc 
            {
                Id = x.Id,
                IsArchived = false
            });
    }

    public IQueryable<Doc> GetArchivedData (...)
    {
        return _archivedContext.Docs.Where(....)
            .Select (x=> new Doc 
            {
                Id = x.Id,
                IsArchived = true
            });
    }

}
0
Ali Kamali 31 मार्च 2020, 03:35
आप इस तरह रिपोजिटॉय पैटर्न का उपयोग कर सकते हैं। यह आपको कोड क्लीनर बनाता है।
 – 
Ali Kamali
31 मार्च 2020, 03:50