مزود ملف تعريف ASP.NET SQL - هل ضربت طريقة ProfileBase.Create () DB؟

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

سؤال

أنا أعمل مع Sqlmembershipprovider واستخدام الملفات الشخصية. لدي فئة مخصصة تسمى UserProfile التي ترث من فئة الملف الإضافي واستخدم هذا لتعيين خصائص مخصصة مثل "FullName". أرغب في حلقة من خلال جميع المستخدمين في قاعدة البيانات والحصول على خصائص ملف التعريف الخاصة بهم. على كل تكرار، أقوم بدعوة PLAIVBASE.CREATE () للحصول على ملف تعريف جديد ثم الوصول إلى الخصائص.

يبدو لي كما هو الحال في كل مرة لكنني مجرد البحث عن تأكيد هذا. لذلك، هل يعرف أحد إذا كان هذا في الواقع ضرب DB في كل مرة؟

والأفضل من ذلك، هل لدى أي شخص حلا أفضل لكيفية إجراء مكالمة واحدة إلى DB للحصول على جميع المستخدمين مع سمات ملف التعريف المخصص الخاصة بهم؟

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

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

المحلول

مايك، أعتقد أن ما لوحظ أنه صحيح. أنا أعمل مع ملف تعريف يستخدم Azure TableStorage كحل بيانات. أردت الحصول على قائمة ملفات تعريف المستخدمين من قاعدة البيانات ودمجها بالمعلومات من مزود العضوية. استغرق الأمر بعض الوقت حتى أدركت أن استدعاء SPALEBASE.CREATE () مع اسم مستخدم أثناء قيام الحجة بإجراء بحث مقابل سطح خشبي وفي الواقع يسترد البيانات المرتبطة باسم المستخدم. بقدر ما أنا قلق، اتصل بهذه الطريقة خلق() هو مضللة، كنت أتوقع حمل() أو يحصل()وبعد حاليا رمزي يشبه هذا:

    public IEnumerable<AggregatedUser> GetAllAggregatedUsers()
    {
        ProfileInfoCollection allProfiles = this.GetAllUsersCore(
             ProfileManager.GetAllProfiles(ProfileAuthenticationOption.All)
        );

        //AggregatedUser is simply a custom Class that holds all the properties (Email, FirstName) that are being used
        var allUsers = new List<AggregatedUser>();

        AggregatedUser currentUser = null;
        MembershipUser currentMember = null;
        foreach (ProfileInfo profile in allProfiles)
        {
            currentUser = null;
            // Fetch profile information from profile store
            ProfileBase webProfile = ProfileBase.Create(profile.UserName);
            // Fetch core information from membership store
            currentMember = Membership.FindUsersByName(profile.UserName)[profile.UserName];
            if (currentMember == null)
                continue;

            currentUser = new AggregatedUser();
            currentUser.Email = currentMember.Email;
            currentUser.FirstName = GetStringValue(webProfile, "FirstName");
            currentUser.LastName = GetStringValue(webProfile, "LastName");
            currentUser.Roles = Roles.GetRolesForUser(profile.UserName);
            currentUser.Username = profile.UserName;
            allUsers.Add(currentUser);
        }

        return allUsers;
    }

    private String GetStringValue(ProfileBase profile, String valueName)
    {
        if (profile == null)
            return String.Empty;
        var propValue = profile.PropertyValues[valueName];
        if (propValue == null)
            return String.Empty;

        return propValue.PropertyValue as String;
    }

هل هناك أفضل (أكثر وضوحا وأداء أكثر) ل

  1. استرداد جميع معلومات الملف الشخصي المخصص من مزود الملف الشخصي و
  2. دمجها مع معلومات موفر العضوية لإظهارها على سبيل المثال في صفحة المسؤول؟

لقد ألقيت نظرة على منشئ ملف تعريف الويب لكن IMO يوفر هذا فقط Intellisense وقت التصميم خصائص الملف الشخصي المخصص عن طريق إنشاء فئة وكيل.

نصائح أخرى

أنت لا تستمر في قاعدة البيانات حتى تتصل Save:

تكتب طريقة حفظ قيم خاصية الملف الشخصي المعدلة إلى مصدر البيانات. يمكن لمزود الملف الشخصي تقليل مقدار النشاط في مصدر البيانات عن طريق إجراء التحديثات فقط عند تعيين خاصية ISDirty إلى True. هذا هو الحال بالنسبة ل SQLProfileProvider الافتراضي.

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