LINQ إلى كيان وإطار البيانات SQL فصول: تغليف الكائن الأعمال

StackOverflow https://stackoverflow.com/questions/223931

  •  03-07-2019
  •  | 
  •  

سؤال

ما هي الطرق المفضلة لديك لتغليف LINQ إلى فئات الكيان SQL والطبقات السياق البيانات إلى الكائنات الأعمال؟

وماذا هل وجدت للعمل في حالة معينة؟

هل اخترع أو اتخذها لأي أنماط معينة؟

هل كانت مفيدة؟

المحلول

ولقد وجدت نمطا الذي أعتقد أنه أفضل الأعمال - في حالتي، على الأقل.


أقدم الطبقات كيان باستخدام فئات جزئية. يمكنني استخدام فئات جزئية بحيث لا يتغير توقيع الكيان (انظر الدعوة DeleteOnSubmit في طريقة Delete).

ولقد يطبخ على مثال صغير. وإليك صورة من قاعدة بيانات وLINQ لإعداد الطبقة SQL:



وهنا الطبقة الجزئية التي I تنفيذ منطق الأعمال:

/// <summary>
/// This class extends BusinessLogicDataContext.Products entity class
/// </summary>
public partial class Product
{
    /// <summary>
    /// New up a product by column: dbo.Products.ProductId in database
    /// </summary>
    public Product(Int32 id)
    {
        var dc = new BusinessLogicDataContext();

        // query database for the product
        var query = (
            from p in dc.Products 
            where p.ProductId == id 
            select p
        ).FirstOrDefault();

        // if database-entry does not exist in database, exit
        if (query == null) return;

        /* if product exists, populate self (this._ProductId and
           this._ProductName are both auto-generated private
           variables of the entity class which corresponds to the
           auto-generated public properties: ProductId and ProductName) */
        this._ProductId = query.ProductId;
        this._ProductName = query.ProductName;
    }


    /// <summary>
    /// Delete product
    /// </summary>
    public void Delete()
    {
        // if self is not poulated, exit
        if (this._ProductId == 0) return;

        var dc = new BusinessLogicDataContext();

        // delete entry in database
        dc.Products.DeleteOnSubmit(this);
        dc.SubmitChanges();

        // reset self (you could implement IDisposable here)
        this._ProductId = 0;
        this._ProductName = "";
    }
}

واستخدام منطق الأعمال المنفذة:

// new up a product
var p = new Product(1); // p.ProductId: 1, p.ProductName: "A car"

// delete the product
p.Delete(); // p.ProductId: 0, p.ProductName: ""

وعلاوة على ذلك: LINQ إلى SQL الطبقات كيان مفتوحة جدا في الطبيعة. وهذا يعني أن الخاصية المقابلة ل<م> dbo.Products.ProductId العمود تنفذ على حد سواء جالبة واضعة - هذا المجال لا ينبغي أن تكون قابلة للتغيير

لمعرفتي لا يمكنك تجاوز الخصائص باستخدام فئات جزئية، فما أفعل عادة هو تنفيذ مدير الذي يضيق الكائن باستخدام واجهة:

public interface IProduct
{
    Int32 ProductId { get; }

    void Delete();
}

نصائح أخرى

وأنا أميل إلى استخدام نمط مستودع لتغليف DataContexts.

نمط مستودع

وأود أن تجد طريقة أفضل لتنبعث الأجسام POCO من طبقة البيانات الخاصة بي أثناء استخدام مصمم الرسم Linq2SQL بالرغم من ذلك.

ولقد نشرت عينة من كيف يمكنك هيكل التطبيق الذي يستخدم LINQ إلى SQL للتخزين، وذلك باستخدام اللجنة الاولمبية الدولية وقوالب T4.

<وأ href = "http://daniel.wertheim.se/2010/03/14/linq-to-sql-how-to-separate-the-entities-and-the-datacontext/" يختلط = " noreferrer نوفولو "> http://daniel.wertheim.se/2010/03/14/linq-to-sql-how-to-separate-the-entities-and-the-datacontext/

والآن أحاول استخدام LINQ إلى فئات الكيان SQL ككائنات الأعمال، لتمرير حول لهم بين الوظائف والخدمات.

وبطبيعة الحال، يجب أن يكون على دروس كيان منفصل عن الوصول إلى قاعدة البيانات ، أو حتى تصميم قاعدة البيانات الخاصة بك يمكن أن تتغير دون تغيير الكائنات الأعمال!

وسأكون الأكثر اهتماما في حل جيد لهذا، أيضا!

تحقق من الشفرة المصدرية للتطبيق نموذج MVC أن روب Conery يضع معا:

http://www.codeplex.com/mvcsamples/

وكان لديه طبقة كيان منفصل أن يعين في LINQ إلى SQL الطبقات.

وفعلت بعض التجارب باستخدام إطار الكيان وينق إلى الكيانات باعتبارها وسيلة لزيادة فصل كود موكلي من قاعدة البيانات، ولكن وجدت أنه أخرق لاستخدام وقلقا حول أداء.

في مشروعي الحالي يمكنني استخدام LINQ إلى SQL كما طبقة البيانات الخاصة بي، ولكن لديها فصول منفصلة حيث كنت تنفيذ جميع الاستفسارات ينق. الطبقات تعود الكيانات المحددة في بلدي LINQ إلى SQL السياق، ولكن الاستعلامات مخفية في الأساليب.

ولقد وجدت هذه المواد من قبل <وأ href = "http://codebetter.com/blogs/ian_cooper/archive/2008/07/01/architecting-linq-to-sql-part-10.aspx#184170" يختلط = "نوفولو noreferrer"> إيان كوبر في CodeBetter.com و ستيفن فالتر سلسلة لا تقدر بثمن في فهم الحاجة إلى كتابة الكيانات POCO أولا ثم رسم خريطة لها إلى قاعدة البيانات بدلا من فعل ذلك على العكس من ذلك (وهو ما كنت دائما أن تفعل).

وأنا حول اللعب مع فكرة أن يكون لها طبقة منفصلة من نموذج OO (دعم أفضل للممارسات OO)، ولكن أن استخدام LINQ إلى SQL تحت غطاء محرك السيارة. والفكرة هي أن يكون لديك ملف XML التي سوف تستخدم أداة مخصصة لإنشاء التعليمات البرمجية. منذ LINQ إلى SQL entites هي تشوش جدا لبلدي الأفضليات، وسوف لصناعة السيارات في إنشاء فئات جديدة لاستخدام ككيانات بلدي وبالطبع سوف تكون مخفية DataContext تماما لرمز العميل. هل الجواب القصير هو: خلق الطبقات كيان جديدة ولكن استخدام LINQ الأساسي للكيانات SQL وDataContext

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top