কীভাবে সত্তা ফ্রেমওয়ার্ক ডেটা প্রবন্ধটি পাঠযোগ্যভাবে তৈরি করবেন make


112

আমাকে তৃতীয় পক্ষের প্লাগইনগুলিতে একটি সত্ত্বা ফ্রেমওয়ার্ক ডেটা প্রসঙ্গটি প্রকাশ করতে হবে। উদ্দেশ্য এই হ'ল এই প্লাগইনগুলিকে কেবল ডেটা আনার অনুমতি দেওয়া এবং তাদের সন্নিবেশ, আপডেট বা মোছা বা অন্য কোনও ডাটাবেস পরিবর্তন কমান্ডের ইস্যু না করা। অতএব আমি কীভাবে কোনও ডেটা প্রসঙ্গ বা সত্তা পঠনযোগ্য করতে পারি।


3
তাদের এমন একটি ব্যবহারকারীর সাথে একটি প্রসঙ্গ দিন যার ডেটাবেজে লেখার অ্যাক্সেস নেই।
vcsjones

ধন্যবাদ। আমি একটি এসকিউএল ডাটাবেস ব্যবহার করছি। সবেমাত্র এটি জানতে পেরেছিল যে এটি সংযোগ স্ট্রিং বিকল্পের মাধ্যমে কেবল পাঠযোগ্য মোডে খোলা যেতে পারে।
হরিণদাকা

2
তাদের একটি দেবেন না DbContext, তাদের একটি IQueryableবা কয়েকটি দিন।
ta.speot.is

উত্তর:


178

কেবলমাত্র পঠনযোগ্য ব্যবহারকারীর সাথে সংযোগ স্থাপনের পাশাপাশি, আপনি আপনার ডিবি কনটেক্সটটিতে আরও কয়েকটি জিনিস করতে পারেন।

public class MyReadOnlyContext : DbContext
{
    // Use ReadOnlyConnectionString from App/Web.config
    public MyContext()
        : base("Name=ReadOnlyConnectionString")
    {
    }

    // Don't expose Add(), Remove(), etc.
    public DbQuery<Customer> Customers
    {
        get
        {
            // Don't track changes to query results
            return Set<Customer>().AsNoTracking();
        }
    }

    public override int SaveChanges()
    {
        // Throw if they try to call this
        throw new InvalidOperationException("This context is read-only.");
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Need this since there is no DbSet<Customer> property
        modelBuilder.Entity<Customer>();
    }
}

1
এটি স্পষ্টতই আপনি একজন 'ভিতরের মানুষ' :) :) এটি 'পঠনযোগ্য' সংযোগের চেয়ে অনেক বেশি আকর্ষণীয়
এনএসগাগা-বেশিরভাগ-নিষ্ক্রিয়

6
নোট করুন যে AsNoTracking()ব্যবহারটি অলস লোডিং ব্যবহার করা অসম্ভব করে দেবে।
টম পাউরেক

@ টমপৌড়েক আমি জানি না যে এটি সত্য কিনা ... আমি মনে করি ইএফ এখনও অলস-লোডিং প্রক্সি তৈরি করে, তবে পরিচয়ের সমাধানটি কিছুটা অদ্ভুত হতে পারে।
bricelam

3
public override Task<int> SaveChangesAsync()পাশাপাশি ওভাররাইড করতে ভুলবেন না ।
পিট

7
এই উপর নির্ভর করবেন না, কারণ (context as IObjectContextAdapter).ObjectContext.SaveChanges()এখনও কাজ করবে। সেরা পছন্দটি হ'ল DbContext(string nameOrConnectionString);ডাটাবেস তৈরির স্টাফগুলির জন্য পঠন / রাইটিং সংযোগের স্ট্রিং এবং পরে কেবল একটি পঠন সংযোগ স্ট্রিং সহ কনটস্ট্রাক্টর ব্যবহার করা ।
জর্জেন স্টেইনব্লক

32

গৃহীত উত্তরের বিপরীতে, আমি বিশ্বাস করি উত্তরাধিকারের তুলনায় রচনাকে সমর্থন করা ভাল । তারপরে কোনও ব্যতিক্রম ছড়িয়ে দেওয়ার জন্য সেভচেন্জেসের মতো পদ্ধতি রাখার প্রয়োজন হবে না। তদুপরি, আপনার প্রথম কেন এই জাতীয় পদ্ধতি থাকা দরকার? আপনার ক্লাসটি এমনভাবে ডিজাইন করা উচিত যাতে এটির পদ্ধতির তালিকার দিকে তাকালে এর গ্রাহক বোকা না হয়। সার্বজনীন ইন্টারফেসটি শ্রেণীর আসল অভিপ্রায় এবং লক্ষ্যটির সাথে একত্রিত হওয়া উচিত যখন গ্রহণযোগ্য উত্তরে সেভচেন্জেস থাকার বিষয়টি বোঝায় না যে প্রসঙ্গটি কেবল পঠনযোগ্য।

যে জায়গাগুলিতে আমার কেবল পঠনযোগ্য প্রবন্ধ থাকতে হবে যেমন সিকিউআরএস প্যাটার্নের পড়ুন পাশে , আমি নিম্নলিখিত বাস্তবায়নটি ব্যবহার করি। এটি এর গ্রাহককে জিজ্ঞাসা করার ক্ষমতা ছাড়া অন্য কিছু সরবরাহ করে না।

public class ReadOnlyDataContext
{
    private readonly DbContext _dbContext;

    public ReadOnlyDataContext(DbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public IQueryable<TEntity> Set<TEntity>() where TEntity : class
    {
        return _dbContext.Set<TEntity>().AsNoTracking();
    }
}

ReadOnlyDataContext ব্যবহার করে, আপনি কেবল DbContext এর সন্ধানের ক্ষমতা অ্যাক্সেস করতে পারেন। ধরা যাক আপনার অর্ডার নামে একটি সত্তা রয়েছে, তারপরে আপনি নীচের মত একটিভাবে ReadOnlyDataContext উদাহরণটি ব্যবহার করবেন।

readOnlyDataContext.Set<Order>().Where(q=> q.Status==OrderStatus.Delivered).ToArray();

এই পদ্ধতিটি কি কেবলমাত্র db_datareader স্কয়ার লগইন ব্যবহারের অনুমতি দেয়? একটি মানক DBContext EF দিয়ে ক্রিয়েট টেবিলের অনুমতিটি অস্বীকার করা হয়েছে এমনকি আমার কোয়েরি কোডটিতে কোনও সেভচেনজ () অন্তর্ভুক্ত না থাকলেও।
পৌঁছেছেন

2
এবং এটিকে উত্তরাধিকার IDisposable
সূচনা করুন

<> সেটটি ব্যবহার না করে, আমি কোয়েরি <> পরামর্শ দেব। public IQueryable<TEntity> Get<TEntity>() where TEntity : class { return _dbContext.Query<TEntity>().AsNoTracking(); }
অ্যালান

@ হ্কারস্ক - নিশ্চিত না যে আমি এটি করতাম। যেহেতু এই কলটি DbContext তৈরি করে না, তাই এটি নিষ্পত্তি করা উচিত নয়। এটি পরে বাগগুলি ট্র্যাক করার জন্য কিছুটা শক্তিতে ডেকে আনতে পারে।
অ্যালান নিলসন

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