سؤال

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

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

public class cAccountEmployee : cAccountEntity
{
    public string id_number
    {
        get
        {
            try
            {
                return this.cAccountEntityValues.Single(e => e.type == 1).value;
            }
            catch (Exception)
            {
                return "";
            }
        }

        set
        {
            try
            {
                this.cAccountEntityValues.Single(e => e.type == 1).value = value;
            }
            catch (Exception)
            {
                this.cAccountEntityValues.Add(new cAccountEntityValue()
                                            {
                                                accountentity_id = this.id,
                                                cAccountEntity = this,
                                                type = 1,
                                                value = value
                                            });
            }
        }
    }

}

ثم في مستودعي (لا يرث شيئًا)

public IEnumerable<cAccountEmployee> All(int accountholder_id)
    {
        return db.cAccountEntities.Where(e => e.accountholder_id == accountholder_id).OrderBy(a => a.name).Cast<cAccountEmployee>();
    }

    public cAccountEmployee Single(int id)
    {
        return db.cAccountEntities.Single(a => a.id == id) as cAccountEmployee;
    }

فشل فريق التمثيل في الطريقة الفردية ومن ثم أعود خاليًا.أفهم أنه لا يمكنك تحديد عوامل التشغيل الصريحة أو الضمنية من أو إلى فئة أساسية؟كيف يمكنني الحصول على نتيجة Linq للفئة الأساسية لتتوافق مع فئة الموظف الموروثة، مع الحفاظ على حالة قاعدة البيانات الخاصة بها حتى أتمكن من إرسال التغييرات؟

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

المحلول

مع LINQ-to-SQL، هناك طريقتان يمكن أن يعمل بهما الوراثة:

  • أداة التمييز على جدول واحد (غير مناسبة لأن بياناتك غير متجانسة)
  • فئة أساسية/جداول متعددة (لا يعني ذلك أن هذا غير مدعوم في dbml - فقط إذا قمت بكتابة الفئات يدويًا)

لا يدعم LINQ-to-SQL وراثة الجداول المتعددة (أي.كائن واحد يحتوي على بيانات من جداول متعددة).Entity Framework يفعل ذلك، ولكنه أكثر تعقيدًا؛انت تستخدم .Cast<T> و .OfType<T> في EF للإلقاء/التصفية بناءً على الأنواع الفرعية.

قد ترغب في إلقاء نظرة على:

ما هو الغرض من الطبقة الأساسية هنا؟إذا أضاف سلوكًا، فيمكنك تحرير dbml لتحديد فئة أساسية مشتركة لجميع كياناتك.إذا كان لديه خصائص البيانات ثم يصبح الأمر أكثر صعوبة.

أنا شخصياً لن أفعل ذلك بهذه الطريقة..سأحتفظ بفئات منفصلة للأنواع المختلفة، وأستخدم سياق البيانات بشكل صحيح، باستخدام الجداول المنفصلة لكل نوع:

public IEnumerable<Employee> All(int accountholder_id)
{
    return db.Employees.Where(e => e.accountholder_id == accountholder_id)
        .OrderBy(a => a.name);
}

public Employee Single(int id)
{
    return db.Employees.Single(a => a.id == id);
}

لذلك - هل يمكنك توضيح ما cAccountEntity هل هنا؟

نصائح أخرى

وشكرا على المدخلات، وسوف تبدو على بعض الاقتراحات ...

وكانت الفكرة وراء كيان حساب أنه اعتبارا من الآن في موقع يحتاج فقط للتعامل مع الموظفين ولكن في المستقبل قد ترغب في إضافة المركبات وغيرها لنظام، ويستخدم هذا النظام لتحديد تكاليف كيان، لذلك لهذا الغرض يتم التعامل مع الموظف نفس السيارة.

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

في قانون بلدي ولكن أريد أن أتحدث عن موظف لا حول نوع كيان عام (جعل تحكم، عرض الخ أسهل بكثير في التطبيق MVC). كما لا يمكن أن العرض الصب المعرفة من القاعدة إلى فئة مشتقة لقد تخطي inheritting واستخدامها الحل التالي بدلا من ذلك. قليلا أكثر تعقيدا ولكن لا عمل ... واسمحوا لي أن أعرف إذا كان هناك شخص يمكن أن يرى طريقة أفضل للقيام بذلك.

public class cAccountEmployee
{
    private cAccountEntity entity;

    public int id
    {
        get
        {
            return this.entity.id;
        }
        set
        {
            this.entity.id = value;
        }
    }

    public string name
    {
        get
        {
            return this.entity.name;
        }
        set
        {
            this.entity.name = value;
        }
    }

    public int accountholder_id
    {
        get
        {
            return this.entity.accountholder_id;
        }
        set
        {
            this.entity.accountholder_id = value;
        }
    }

    public System.Data.Linq.EntitySet<cAccountEntityValue> cAccountEntityValues
    {
        get
        {
            return this.entity.cAccountEntityValues;
        }
    }

    public cAccountHolder cAccountHolder
    {
        get
        {
            return this.entity.cAccountHolder;
        }
    }

    public cAccountEmployee()
    {
        this.entity = new cAccountEntity();
    }

    public cAccountEmployee(cAccountEntity entity)
    {
        this.entity = entity;
    }

    public string id_number
    {
        get
        {
            try
            {
                return this.entity.cAccountEntityValues.Single(e => e.type == 1).value;
            }
            catch (Exception)
            {
                return "";
            }
        }

        set
        {
            try
            {
                this.entity.cAccountEntityValues.Single(e => e.type == 1).value = value;
            }
            catch (Exception)
            {
                this.entity.cAccountEntityValues.Add(new cAccountEntityValue()
                                            {
                                                accountentity_id = this.id,
                                                cAccountEntity = this.entity,
                                                type = 1,
                                                value = value
                                            });
            }
        }
    }
}

//In the repository
public cAccountEmployee Single(int id)
    {
        return new cAccountEmployee(db.cAccountEntities.Single(a => a.id == id));
    }
<اقتباس فقرة>   

وكيف يمكنني الحصول على ينق نتيجة الفئة الأساسية للادلاء تصل إلى فئة الموظف الموروثة

وانها ليست المهوى الصاعد، انها مسبل.

وأعتقد أنك لا تفهم الصب أو ربما - نوع المثال مقابل نوع مرجع

public class Animal { }
public class Zebra : Animal { }

public class Zoo
{
    public void ShowZebraCast()
    {
        Animal a = new Animal();
        Zebra z = (Zebra)a;
    }
}

وSystem.InvalidCastException: الإضافة غير قادر على تحويل كائن من نوع 'الحيوانات' إلى كتابة "زيبرا"

في نفس الطريق، لديك مثيل الكيان الذي لا يمكنك مسبل إلى استخدام مرجع الموظف ضدها.

هل يمكن تحويل أنواع، ولكن بعد ذلك لديك لتوفير طريقة التحويل.

public partial class Animal { }
public class Zebra : Animal { }
//in another file
public partial class Animal{
  public Zebra ToZebra(){
    return new Zebra() { //set Zebra properties here.
    };
  }
}


public class Zoo
{
    public void ShowZebraConvert()
    {
        Animal a = new Animal();
        Zebra z = a.ToZebra();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top