我是 c# 的新手,我正在研究一个访问 mysql 数据库并有两个模型的实体框架项目:User 和 Company。
问题是,当建立连接时,数据库连接一切正常,模型获取所有用户信息,甚至 companyId,但其他公司属性(例如 companyName 返回为 null,accountType 返回为 0.
我不知道问题出在哪里。 用户看起来像这样:
public partial class user
{
public user()
{
this.company = new company();
}
public System.Guid userId { get; set; }
public System.Guid companyId { get; set; } //this is my fk
public string username { get; set; }
public virtual company company { get; set; }
public string companyName => company?.Name;
public int AccountType => company?.AccountType ?? 5;
}
我的公司班级是这样的:
public partial class company
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public organization()
{
this.users = new HashSet<user>();
}
public System.Guid companyId { get; set;}
public string Name { get; set; }
public string Address { get; set; }
public int AccountType { get; set; }
System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<user> users { get; set; }
}
我的onModel创建方法:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<user>()
.HasRequired(u => u.company)
.WithMany(c => c.users)
.HasForeignKey(u => u.companyId);
}
EF默认不会加载关系,你需要使用其中一种方法加载相关数据。我个人通常更喜欢eager loading,例如:
var user = dbContext.Users
.Include(u => u.company)
.FirstOrDefault(u => u.userId == someId);
您还可以配置自动包含:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Entity<user>().Navigation(e => e.company).AutoInclude();
}
附言
考虑遵循推荐的 C# 编码约定(例如使用 PascalCasing 的类和属性名称,即
user
-> User
)