Я работаю над проектом с использованием ASP.Net MVC4, где я использую SimpleMembership для работы с системой членства.
В дополнение к таблице UserProfile, где я должен хранить данные по умолчанию, у меня есть две таблицы в моей собственной базе данных (Student, Teacher).
Я настроил регистрацию, добавив новое поле, где я прошу нового пользователя определить, является ли он учителем или учеником.
public class UsersContext : DbContext
{
//public UsersContext()
// : base("DefaultConnection")
//{
//}
public DbSet<Student> Students { get; set; }
public DbSet<Teacher> Teachers { get; set; }
public DbSet<UserProfile> UserProfiles { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<UserProfile>()
.HasRequired(u => u.Student)
.WithOptional(p => p.UserProfile)
.Map(m => m.MapKey("IDStudent"));
modelBuilder.Entity<UserProfile>()
.HasRequired(u => u.Teacher)
.WithOptional(p => p.UserProfile)
.Map(m => m.MapKey("IDTeacher"));
}
}
И таблица профиля пользователя становится такой
[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
public string AccountType { get; set; }
public virtual Student student { get; set; }
public virtual Teacher teacher { get; set; }
}
Я добавил этот внешний ключ в оба класса Student , Teacher
public virtual UserProfile UserProfile { get; set; }
Контроллер учетной записи / Класс регистрации
WebSecurity.CreateUserAndAccount(
model.UserName,
model.Password,
new { AccountType = model.AccountType },
false);
WebSecurity.Login(model.UserName, model.Password);
UsersContext db = new UsersContext();
var membership = (SimpleMembershipProvider)Membership.Provider;
membership.ValidateUser(model.UserName, model.Password);
membership.ConfirmAccount(model.UserName, model.Password);
UserProfile user = db.UserProfiles.FirstOrDefault(u => u.UserName.ToLower() == model.UserName.ToLower());
if (model.AccountType == "Teacher")
{
if (userid != null)
CreateNewTeacher(user.UserId , model.UserName);
}
if (model.AccountType == "Student")
{
if (userid != null)
CreateNewStudentt(user.UserId , model.UserName);
}
После написания этих двух классов
public void CreateNewStudent( int id, string username)
{
// Attempt to register the user
using (UsersContext db = new UsersContext())
{
Student student = new Student {User_Name = username};
student.id=id;
db.Students.Add(student);
db.SaveChanges();
}
}
public void CreateNewTeacher(int id,string username)
{
using (UsersContext db = new UsersContext())
{
Teacher teacher = new Teacher();
teacher.id=id;
db.Teacher.Add(teacher);
db.SaveChanges();
}
}
Мой вопрос: на каком уровне я должен создать пользователя в своей собственной таблице (я хотел бы сохранить тот же идентификатор). Итак, я хотел бы знать, когда простое членство создает пользователя в своих таблицах, чтобы скопировать его в мою.
Как я могу получить идентификатор пользователя!
Хороша ли моя стратегия работы с бухгалтерией! или я ошибаюсь, думая таким образом.
ОБНОВЛЕНИЕ Я добавил [ключ] (он не был сгенерирован)
public partial class Agent
{
public Teacher()
{
this.Tasks = new HashSet<Tasks>();
}
[Key]
public int ID_Teacher { get; set; }
public string Name_Teacher { get; set; }
public System.DateTime Bday_Teacher { get; set; }
public string User_Name { get; set; }
public virtual ICollection<Task> Tasks { get; set; }
}
public partial class Task
{
[Key, ForeignKey("Teacher"), Column(Order = 0)]
public int ID_Teacher { get; set; }
[Key, ForeignKey("Student"), Column(Order = 1)]
public int ID_Student { get; set; }
[Key, ForeignKey("DateT"), Column(Order = 2)]
public int ID_DateT { get; set; }
[Key]
public Nullable<int> ID_Comment { get; set; }
public virtual Teacher Teacher { get; set; }
public virtual Student Student { get; set; }
public virtual DateT DateT { get; set; }
}
Я ценю ваше время и усилия!
С уважением ,
Entities
, как я показал вам, все, что вам нужно, этоUserProfile = userProfile
, как я сделал вStudent Create Action
, который вставляетUserId Foreign key
вTeacher Object
03.04.2013public ActionResult Create(Student model)
, но это плохая практика, когда вашViews
общается напрямую с вашими сущностями. На данный момент все в порядке, как только вы узнаете несколько вещей,ViewModels
это путь. Кроме того, не полагайтесь на генерацию кода, убедитесь, что вы изучаетеEntity Framework Code First
Это поможет вам лучше понять вещи, поскольку вы будете писать большую часть кода. 04.04.2013User.Identity.Name
04.04.2013AccountType
, рекомендуется использоватьuserProfile.AccountType.ToLower()
. Если вы сделаете, как я показал вам, этот код должен работать. Причина, по которой я использовал «userProfile, а не модель», заключается в том, что мы должны получать данные от вошедшего в систему пользователя. 04.04.2013