Я создал проект Empty MVC (веб-приложение ASP.NET), используя Visual Studio 2013 Update 2 RC, а затем добавил образцы удостоверений AspNet, используя:
PM> Установить-пакет Microsoft.AspNet.Identity.Samples -Pre
Я включил и добавил миграции, а затем обновил базу данных, в которой были созданы таблицы по умолчанию.
Я хочу создать таблицу клиентов, содержащую 2 столбца в качестве внешних ключей, чтобы:
- Таблица групп (столбец GroupId)
- Таблица AspNetUsers (столбец Id)
Итак, я создал 2 класса Customer и Group и добавил внешние ключи, используя аннотации данных, как показано ниже:
namespace IdentitySample.Models
{
// You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
static ApplicationDbContext()
{
// Set the database intializer which is run once during application start
// This seeds the database with admin user credentials and admin role
Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
public DbSet<Customer> Customers { get; set; }
public DbSet<Group> Groups { get; set; }
}
public class Customer
{
public int CustomerId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public int GroupId { get; set; }
public string CreatedBy { get; set; }
[ForeignKey("GroupId")]
public Group Groups { get; set; }
[ForeignKey("CreatedBy")]
public ApplicationUser ApplicationUsers { get; set; }
}
public class Group
{
public int GroupId { get; set; }
public string GroupName { get; set; }
}
}
Кажется, все в порядке, диаграмма ApplicationDbContext.edmx, созданная с помощью инструментов EF Power, также выглядит нормально, и проект строится правильно.
Затем я добавил CustomersController, используя шаблон построения «Контроллер MVC 5 с представлениями, использующий Entity Framework».
Теперь я получаю ошибку компиляции (в db.ApplicationUsers)
// GET: Customers/Create
public ActionResult Create()
{
ViewBag.CreatedBy = new SelectList(db.ApplicationUsers, "Id", "Email");
ViewBag.GroupId = new SelectList(db.Groups, "GroupId", "GroupName");
return View();
}
Сведения об ошибке: IdentitySample.Models.ApplicationDbContext не содержит определения для ApplicationUsers, и не может быть найден метод расширения ApplicationUsers, принимающий первый аргумент типа IdentitySample.Models.ApplicationDbContext (если вам не хватает директиву using или ссылку на сборку?)
Когда я добавляю код ниже в ApplicationDbContext
public DbSet<ApplicationUser> ApplicationUsers { get; set; }
Я получаю ошибку:
Несколько наборов объектов для одного типа не поддерживаются. Наборы объектов ApplicationUsers и Users могут содержать экземпляры типа IdentitySample.Models.ApplicationUser.
Я хочу добавить CreatedBy в качестве внешнего ключа к AspNetUsers, с помощью которого шаблон генерирует раскрывающийся список CreatedBy, аналогичный раскрывающемуся списку GroupId:
Как мы можем использовать таблицы, сгенерированные идентификатором, с другими таблицами, созданными пользователем, если таблица, созданная пользователем, имеет ссылки внешнего ключа на таблицы, созданные с помощью идентификатора. И у вас есть первоклассный опыт генерации кода каркаса с использованием «Контроллера MVC 5 с представлениями, использующего Entity Framework»?
(Подобно тому, что у нас есть с таблицей Customers & Groups, где в таблице Customers есть GroupId Foreign ключевая ссылка)