Code first i membership provider

0

Cześć.

Mam pytanie odnośnie membership providera dla ASP .NET MVC.

Jak rozszerzyć ViewModel dla rejestracji i dodać do niego więcej pól? ( Do samego ViewModelu można bez problemu dopisać ) natomiast w AccountControlerze znajduje się metoda AddMemberAsync() która nie przyjmuje więcej parametrów i nie ma do niej dostępu aby ją nadpisać )

Oprócz tego jak dodać swój kontekst ze swoimi własnymi modelami aby wygenerowały się dodatkowe tabele oprócz tych domyślnych ?

Z góry dziękuję za pomoc ;)

0

Z tego co się orientuję, ASP.NET Identity (http://www.asp.net/identity) umożliwia dodawanie dodatkowych pól. Nie wiem na ile możesz z niego skorzystać, ale warto się z nim zapoznać.

0

gdzie znajduje się taka funkcja? bo ja w account controller nie mam czegoś takiego... do tego dochodzi pytanie jaki typ uwierzytelniania używasz?

0

Ok już wyjaśniam.

Więc korzystam z "Inidividual User Accounts".

Chodzi mi konkretnie o metodę w AccountControlerze w POSTowej akcji Register i tam znajdje się UserManager.CreateAsync(), która przyjmuje tylko dwa parametry user i model.Password.

A wcześniej niby tworzymy tego usera i pobieramy username ale nie mogę dopisać tam więcej właściwości. W sumie nie wiem jak.

Chce zrobić po prostu Context() tak jak robi się to w Code First i w tym kontekscie potworzyć sobie DbSety<> i Mapingi przy użyciu fluentMaping.

Natomiast takie pytanie mam jak to zgrać z tym membership providerem bo ona ma tam swój Context() znajdujacy się w IdentityModel.cs zwany ApplicationDbContext IdentityDbContext<ApplicationUser>

No i np. jak chce dobrać się do tego IdentityDbContext<> dając ppm -> go to declaration to otwiera mi się Object Browser i nie mam dostępu do tych klas :P

0

@Odyn
Możesz sobie normalnie dodawać DBSety< przecież w Entity Frameworku (tym z Identity) i one tworzą osobną tabelę (sprawdzałem). Metoda CreateAsync przyjmuje user czyli tworzysz usera a potem przekazujesz do metody, tak?

0

@Truster_log

Ok a w którym miejscu wstawiasz te DbSety? W IdentityModel.cs czy gdzieś indziej?

Ja myślałem właśnie zrobić 2 kontext ale chyba będzie krzyczał po mnie że dwa konteksty nie mogą istnieć :)

0

Dobra wiem już :)

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}

    // dbsety tutaj :)

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}
0

Wygenerowały się moje modele. Tylko, że musiałem skorzystać z migracji :)

0

Natomiast mem teraz trochę inny problem.

Entities in 'ApplicationDbContext.Addresseses' participate in the 'Addresses_Suplier' relationship. 0 related 'Addresses_Suplier_Target' were found. 1 'Addresses_Suplier_Target' is expected.

W tych modelach:

 
public class Addresses
    {
        public int Id { get; set; }
        public string Country { get; set; } // panstwo
        public string PostalCode { get; set; } // kod pocztowy
        public string City { get; set; } // miasto
        public string StreetName { get; set; } // pelna nazwa ulicy
        public string FlatNumber { get; set; } // numer mieszkania
        public virtual Customer Customer { get; set; }
        public virtual Suplier Suplier { get; set; }

    }
 
public class Suplier
    {
        public int Id { get; set; }
        public string CompanyName { get; set; } // nazwa firmy
        public ICollection<Addresses> Address { get; set; } // jej adresy
    }

A w fluent mapping mam tak:

 
protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

            // ustalenie kluczy dla poszczególnych modeli
            modelBuilder.Entity<Addresses>().HasKey(a => a.Id);
            modelBuilder.Entity<Product>().HasKey(a => a.Id);
            modelBuilder.Entity<ProductCategory>().HasKey(a => a.Id);
            modelBuilder.Entity<NutritionalValue>().HasKey(a => a.Id);
            modelBuilder.Entity<Customer>().HasKey(a => a.Id);
            modelBuilder.Entity<Order>().HasKey(a => a.Id);
            modelBuilder.Entity<OrderDetail>().HasKey(a => a.Id);
            modelBuilder.Entity<Suplier>().HasKey(a => a.Id);

            // definicj relacji pomiedzy modelami
            modelBuilder.Entity<Suplier>().HasMany(s => s.Address);

            modelBuilder.Entity<Product>().HasMany(p => p.Category);
            modelBuilder.Entity<Product>().HasMany(p => p.Supliers);
            modelBuilder.Entity<Product>().HasMany(p => p.OrderDetails);
            modelBuilder.Entity<Product>().HasRequired(p => p.NutritionalValues);

            modelBuilder.Entity<ProductCategory>().HasMany(p => p.Products);

            modelBuilder.Entity<OrderDetail>().HasMany(od => od.Products);
            modelBuilder.Entity<OrderDetail>().HasRequired(od => od.Order);

            modelBuilder.Entity<Order>().HasRequired(o => o.OrderDetail);
            modelBuilder.Entity<Order>().HasRequired(o => o.Customer);
            modelBuilder.Entity<Order>().HasMany(o => o.Products);

            modelBuilder.Entity<Customer>().HasMany(c => c.Addresses);
            modelBuilder.Entity<Customer>().HasMany(c => c.Orders);

            modelBuilder.Entity<Addresses>().HasRequired(a => a.Customer);
            modelBuilder.Entity<Addresses>().HasRequired(a => a.Suplier);

            
            base.OnModelCreating(modelBuilder);
        }

I nie wiem czemu to wywala podczas rejestracji użytkownika poprzez AccountController, którego rejestruje sobie w POSTowej akcji

 [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser()
                {
                    UserName = model.Email,
                    Email = model.Email,
                    Customer = new Customer()
                    {
                        FirstName = model.FirstName,
                        LastName = model.LastName,
                        Age = uint.Parse(model.Age),
                        Gender = model.Gender,
                        PhoneNumber = model.PhoneNumber,
                        Addresses = new Collection<Addresses>()
                        {
                            new Addresses()
                            {
                                 Country = model.Country, 
                                 City = model.City,
                                 PostalCode = model.PostalCode,
                                 StreetName = model.StreetName,
                                 FlatNumber = model.FlatNumber
                            }
                        }
                    }
                };
                IdentityResult result = await UserManager.CreateAsync(user, model.Password);
                if (result.Succeeded)
                {
                    await SignInAsync(user, isPersistent: false);

                    // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
                    // Send an email with this link
                    // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                    // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                    // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    AddErrors(result);
                }
            }
 

Bardzo proszę o pomoc :)

0

Ok wiem już co źle zrobiłem.

Z jednej strony miałem relacje 1 do wielu a z drugiej 1 do 1 i musiałem dodać ICollection<> i aktualizować migracje ;)

0

@Odyn zarzucisz jakis tutorial z którego korzystałeś do nauki Identity ? Jak Twoj OWIM wyglada?

0

Nie mam żadnego tutoriala :) Sam to rozkminiam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1