Я пытаюсь засеять некоторых пользователей SimpleMembershipProvider. Я добавил несколько столбцов в таблицу UserProfile, например номер мобильного телефона. Когда я пытаюсь добавить пользователя с номером мобильного телефона, компилятор сообщает мне:

The name 'Mobile' does not exist in the current context 

Это класс:

namespace _DataContext.Migrations {
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;
    using WebMatrix.WebData;
    using System.Web.Security;

internal sealed class Configuration : DbMigrationsConfiguration<_DataContext.DataContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(_DataContext.DataContext context)
    {
        //  This method will be called after migrating to the latest version.

        //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
        //  to avoid creating duplicate seed data. E.g.
        //
        //    context.People.AddOrUpdate(
        //      p => p.FullName,
        //      new Person { FullName = "Andrew Peters" },
        //      new Person { FullName = "Brice Lambson" },
        //      new Person { FullName = "Rowan Miller" }
        //    );
        //

        SeedMembership();
    }

    private void SeedMembership()
    {
        WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);


        var roles = (SimpleRoleProvider)Roles.Provider;
            var membership = (SimpleMembershipProvider)System.Web.Security.Membership.Provider;

            if (!roles.RoleExists("Administrator"))
                roles.CreateRole("Administrator");

            if (membership.GetUser("Username", false) == null)
                membership.CreateUserAndAccount("Username", "Pass", false, 
                    new Dictionary<string, object> 
                    { 
                        { Mobile = "+311122334455" }, 
                    });

            /*if (!WebSecurity.UserExists("test"))
                WebSecurity.CreateUserAndAccount(
                    "Username",
                    "password",
                    new { 
                            Mobile = "+311122334455", 
                            FirstName = "test", 
                            LastName = "test",
                            LoginCount = 0,
                            IsActive = true,
                        });
              */
    }
  }
}

Если я использую WebSecurity, все будет хорошо.

Что я здесь делаю не так?

0
Yustme 11 Май 2013 в 14:01

1 ответ

Лучший ответ

Именно так вы создаете свой Dictionary, вы не можете:

membership.CreateUserAndAccount("Username", "Pass", false,
    new Dictionary<string, object> 
    { 
        { Mobile = "+311122334455" }, // Mobile won't compile here
    });

Поэтому вместо этого используйте:

membership.CreateUserAndAccount("Username", "Pass", false,
    new Dictionary<string, object> 
    { 
        { "Mobile", "+311122334455" }, // Mobile should be the string in the string, object pair
    });

Как бы то ни было, WebSecurity делает то же самое, что и вы, но избавляет вас от необходимости указывать точного поставщика в вашем коде.

1
Andy Brown 13 Май 2013 в 03:13
Привет, имеет смысл, думаю, я тоже пробовал этот вариант, хотя не уверен. Но что вы имеете в виду, говоря о веб-безопасности, я не могу указать точного поставщика?
 – 
Yustme
13 Май 2013 в 13:07
@Yustme. Он просто отвлекает вас от конкретной реализации поставщика. Его код также принимает Membership.Provider, но приводит его к общему базовому классу для всех поставщиков вместо SimpleMembershipProvider (что потенциально лучше для IoC и / или DI). Если вы не очень беспокоитесь о производительности, я бы использовал WebSecurity.
 – 
Andy Brown
13 Май 2013 в 13:10