实体框架 - 代码第一个关系:一对一个
问题描述:
我有两个表用户和公司:实体框架 - 代码第一个关系:一对一个
public class User
{
// Properties
public long Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Username { get; set; }
public long AgencyId { get; set; }
public Company Company { get; set; }
// Custom Propreties
[ScaffoldColumn(false)]
public string FullName
{
get
{
return FirstName + " " + LastName;
}
}
}
public class Company
{
public long Id { get; set; }
public string Name { get; set; }
public virtual ICollection<User> Users { get; set; }
}
的配置是这样...
public class UserConfiguration : EntityTypeConfiguration<User>
{
public UserConfiguration()
{
this.HasKey(x => x.Id);
this.Property(x => x.Id);
this.Property(x => x.FirstName).IsRequired();
this.Property(x => x.LastName).IsRequired();
this.Property(x => x.Username).IsRequired();
this.Property(x => x.CompanyId).IsRequired();
this.HasRequired(user => user.Company).WithMany().HasForeignKey(user => user.CompanyId);
}
}
public class CompanyConfiguration : EntityTypeConfiguration<Company>
{
public CompanyConfiguration()
{
this.ToTable("Companies");
this.HasKey(x => x.Id);
this.Property(x => x.Id);
this.Property(x => x.Name).IsRequired();
this.HasMany(company => company.Users).WithRequired().HasForeignKey(user => user.CompanyId);
}
}
如果我创建一个视图公司向各公司展示每家公司并在公司中列出一列作为用户人数,则视图按预期呈现,显示每家公司中的用户数量。但是,当我尝试在视图中显示每个用户并在列中显示Company.Name时,则表示Company为null。有人可以解释我的一对一关系是否在用户和公司之间搞砸了吗?
** * ** * ** * ** *编辑* ** * ** * ** * ** * ***
public UserConfiguration()
{
this.HasKey(x => x.Id);
this.Property(x => x.Id);
this.Property(x => x.FirstName).IsRequired();
this.Property(x => x.LastName).IsRequired();
this.Property(x => x.Username).IsRequired();
this.Property(x => x.CompanyId).IsRequired();
this.HasRequired(user => user.Company).WithMany().HasForeignKey(user => user.CompanyId);
this.HasMany(user => user.AdministratorApplications)
.WithMany(application => application.Administrators)
.Map(map =>
{
map.ToTable("ApplicationAdministrators");
map.MapLeftKey("ApplicationId");
map.MapRightKey("UserId");
});
}
public ApplicationConfiguration()
{
this.HasKey(x => x.Id);
this.Property(x => x.Name).IsRequired();
this.Property(x => x.Accronym).IsRequired();
this.Property(x => x.Description);
this.HasMany(application => application.Administrators)
.WithMany(user => user.AdministratorApplications)
.Map(map =>
{
map.ToTable("ApplicationAdministrators");
map.MapLeftKey("UserId");
map.MapRightKey("ApplicationId");
});
}
public ApplicationAdministratorConfiguration()
{
this.ToTable("ApplicationAdministrators");
this.HasKey(x => x.Id);
this.Property(x => x.Id);
this.Property(x => x.ApplicationId).IsRequired();
this.Property(x => x.UserId).IsRequired();
this.HasRequired(appAdmin => appAdmin.Application).WithMany().HasForeignKey(appAdmin => appAdmin.ApplicationId);
this.HasRequired(appAdmin => appAdmin.User).WithMany().HasForeignKey(appAdmin => appAdmin.UserId);
}
这里是ApplicationAdministrator类
public class ApplicationAdministrator
{
[Column("Id")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[HiddenInput]
public long Id { get; set; }
[Display(Name = "Application")]
public long ApplicationId { get; set; }
public virtual Application Application { get; set; }
[Display(Name = "Administrator")]
public long UserId { get; set; }
public virtual User User { get; set; }
}
最后错误中指定
模式是无效的。错误:(144,6):错误0019:该 EntitySet的 'UserApplication' 与模式 'DBO' 和表 'ApplicationAdministrators' 已经定义。每个实体集必须 引用一个唯一的模式和表。公用IQueryable用户 第16行:{返回context.Users.Include(“AdministratorApplications”)。Include(“Company”); } 第18行:} 第19行:
答
你需要让Company
财产virtual
public class User
{
// Properties
public virtual Company Company { get; set; }
}
如果你不想让它virtual
你需要告诉EF加载使用Company
财产Include
方法。
通过使财产virtual
EF将延迟加载属性。但F你正在访问Company
属性,当你访问user
对象,那么你可以使用Include
方法急于负载Company
财产。
var users = context.Users.Include(user => user.Company).Where(/*conditions*/);
您不能在Include中使用lambda表达式。用虚拟修饰公司属性引发这个错误......“已经有一个与此命令关联的开放式DataReader,它必须先关闭。” – bdparrish
@bdparrish你可以发布你的LINQ查询以及你如何访问返回的结果吗? – Eranga
现在明白了,只需将MultipleActiveResultSets = true属性添加到我的连接中,这是我以前从未做过的。 – bdparrish