我们目前正在开发一个小的ASP.NET页面。 我们正在使用EntityFramework(EF)并创建了一个处理DataContext的BaseController。
简化我们有2个型号:
用户模型(来自自动生成的代码):
public class User : IdentityUser
{
public virtual ICollection<Location> Locations { get; set; }
public virtual ICollection<Calendar> Calendars { get; set; }
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User> 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 Calendar
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[DataType(DataType.Text)]
public string GoogleId { get; set; }
[Required]
[DataType(DataType.Text)]
public string Title { get; set; }
[DataType(DataType.Text)]
public string Description { get; set; }
public ICollection<Event> Events { get; set; }
public User User { get; set; }
}
所以我们将这些模型与这些模型联系起来: 一个用户可以拥有许多日历。 但是只有一个日历可以来自一个用户。
以下代码是我们的DataContext:
public class DatabaseContext : IdentityDbContext<User>
{
public DatabaseContext()
{
// ReSharper disable once UnusedVariable
var instance = SqlProviderServices.Instance;
}
public static DatabaseContext Create()
{
return new DatabaseContext();
}
public DbSet<Location> Locations { get; set; }
public DbSet<Calendar> Calendars { get; set; }
public DbSet<Event> Events { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>().HasMany(c => c.Calendars);
}
}
问题现在是,当我使用DataContext时,我从数据库中获取所有内容。但
DataContext db = new DataContext()
db.Calendar ...
在日历中,用户始终为空!
在以下代码中使用ASP.NET MVC向数据库添加日历时:
public ActionResult Create([Bind(Include = "Title,Description")] Models.Calendar calendar)
{
if (ModelState.IsValid)
{
calendar.User = CurrentUser;
calendar.Events = new List<Event>();
Db.Calendars.Add(calendar);
Db.SaveChanges();
return RedirectToAction("Index");
}
return View(calendar);
}
我调试了这个方法,在IF的第一行,它确实将正确的用户设置到日历中。 任何人都可以告诉我,为什么Calendar.User总是为空?
答案 0 :(得分:3)
第一件重要的事情:创建日历时,CurrentUser
对象应附加到上下文中。
我不确定您是否启用了LazyLoading来打开或关闭上下文,但您可以随时尝试查询日历:
(using System.Data.Entity;)
Db.Calendars.Include(calendar => calendar.User).Where(...);
或
Db.Calendars.Include("User").Where(...);
这应该强制EF从数据库加载链接的实体。试试这个,看看它是否适合你。