我有以下结构:
实体:
public abstract class Register
{
public int Id { get; set; }
public int? CreatedById { get; private set; }
public User CreatedBy { get; private set; }
}
public class User : Register
{
[Required]
public int CompanyId { get; set; }
public Company Company { get; set; }
}
public class Company : Register
{
public List<User> Users { get; set; }
public Company()
{
Users = new List<User>();
}
}
的DbContext:
public class Db : DbContext
{
public DbSet<Company> Company { get; set; }
public DbSet<User> User { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
base.OnModelCreating(modelBuilder);
}
}
配置:
public sealed class Configuration : DbMigrationsConfiguration<test_entity.Db>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
}
protected override void Seed(test_entity.Db context)
{
context.Company.Add(new Company());
context.User.Add(new User
{
CompanyId = 1
});
context.SaveChanges();
}
}
的Global.asax:
System.Data.Entity.Database.SetInitializer(new CreateDatabaseIfNotExists<Db>());
System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<Db, Configuration>());
所以,当我的应用程序启动时,我将一个公司和一个用户添加到数据库中,在我的控制器中,我试图让公司与用户合作:
结果是该公司没有用户..
但是当我在其他数据库环境中获得用户时,它有一个公司!!
因此,实体知道两个对象之间的关系..
如果我使用流畅的api配置关系,它将起作用:
modelBuilder.Entity<Company>()
.HasMany(c => c.Users)
.WithRequired(u => u.Company);
如果我删除了该物业&#39; CreatedBy&#39;它也有效。
我的问题是,为什么他不能在没有流畅的api配置的情况下加载用户?以及为什么财产“CreatedBy&#39;影响结果?
答案 0 :(得分:0)
因为您必须通过向模型中的导航属性添加虚拟关键字来启用延迟加载。
public abstract class Register
{
public int Id { get; set; }
public int? CreatedById { get; private set; }
public virtual User CreatedBy { get; private set; }
}
public class User : Register
{
[Required]
public int CompanyId { get; set; }
public virtual Company Company { get; set; }
}
public class Company : Register
{
public virtual List<User> Users { get; set; }
public Company()
{
Users = new List<User>();
}
}
这是实体框架的惯例。有关约定的更多信息here。