Это плохая идея использовать ProfileProvider в новом приложении MVC 3 с Entity Framework? - PullRequest
2 голосов
/ 13 апреля 2011

Я пытался добавить пользовательский класс ProfileProvider в свое приложение MVC 3 с помощью Entity Framework. Я заметил, что он вызывает GetPropertyValues ​​каждый раз, когда я пытаюсь сделать что-то вроде:

profile.FirstName = viewModel.FirstName;

По какой-то причине я могупока не вижу, как обновить значения в базе данных. Это то, что я настроил до сих пор. Я примерно следовал этому уроку: http://www.davidhayden.com/blog/dave/archive/2007/10/30/CreateCustomProfileProviderASPNET2UsingLINQToSQL.aspx

<profile enabled="true" defaultProvider="EfProfileProvider" inherits="Data.BOHProfile" automaticSaveEnabled="true">
    <providers>
        <clear />
        <add name="EfProfileProvider" type="Data.Providers.EfProfileProvider" connectionStringName="BOHEntities" applicationName="BOH" />
    </providers>
</profile>

Класс профиля:

public class BOHProfile : ProfileBase, IBOHProfile
{
    public virtual string FirstName
    {
        get { return base["FirstName"] as string; }
        set { base["FirstName"] = value; }
    }

    public virtual string LastName
    {
        get { return base["LastName"] as string; }
        set { base["LastName"] = value; }
    }

    public virtual string City
    {
        get { return base["City"] as string; }
        set { base["City"] = value; }
    }

    public static BOHProfile CurrentUser()
    {
        return (BOHProfile)(ProfileBase.Create(Membership.GetUser().UserName));
    }

    public static BOHProfile CurrentUser(string userName)
    {
        return (BOHProfile)(ProfileBase.Create(userName));
    }
}

Вот код фактического провайдера:

    public override SettingsPropertyValueCollection GetPropertyValues(SettingsContext context, SettingsPropertyCollection collection)
    {   
        var uow = new EfUnitOfWork();
        var profileRepo = new ProfileRepository(new EfRepository<Profile>(), uow);
        var data = profileRepo.FetchProfileData(context["UserName"].ToString(), ApplicationName);

        return data != null ? ProviderUtility.ConvertToSettingsPropertyValueCollection(data) : null;
    }

    public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection collection)
    {
        var data = ProviderUtility.ConvertFromSettingsPropertyValueCollection(collection);
        var uow = new EfUnitOfWork();
        var profileRepo = new ProfileRepository(new EfRepository<Profile>(), uow);

        profileRepo.SaveProfileData(context["UserName"].ToString(), ApplicationName, data);
        profileRepo.Save();
    }

Возможно, я не понимаю, в чем смысл провайдера профиля, но мне кажется, что я мог бы просто создать класс, который получает и устанавливает данные вмоя таблица профиля, или я что-то не вижу, что я могу использовать в контроллерах, когда у меня настроена эта информация профиля?

1 Ответ

0 голосов
/ 14 апреля 2011

Я придерживался того же подхода к своему текущему приложению MVC3 и в конце концов разочаровался в интеграции в него MembershipProvider.Чем больше я думаю об этом, тем меньше пользы вижу для MembershipProvider ... возможно, именно поэтому API не обновлялся годами:).

...