DataContext始终返回null作为外键

时间:2015-04-28 11:21:09

标签: c# asp.net asp.net-mvc entity-framework model

我们目前正在开发一个小的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总是为空?

1 个答案:

答案 0 :(得分:3)

第一件重要的事情:创建日历时,CurrentUser对象应附加到上下文中。

我不确定您是否启用了LazyLoading来打开或关闭上下文,但您可以随时尝试查询日历:

(using System.Data.Entity;)
Db.Calendars.Include(calendar => calendar.User).Where(...);

Db.Calendars.Include("User").Where(...); 

这应该强制EF从数据库加载链接的实体。试试这个,看看它是否适合你。