2011-08-21 173 views
1

我有两个表用户和公司:实体框架 - 代码第一个关系:一对一个

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行:

回答

3

你需要让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*/); 
+0

您不能在Include中使用lambda表达式。用虚拟修饰公司属性引发这个错误......“已经有一个与此命令关联的开放式DataReader,它必须先关闭。” – bdparrish

+0

@bdparrish你可以发布你的LINQ查询以及你如何访问返回的结果吗? – Eranga

+0

现在明白了,只需将MultipleActiveResultSets = true属性添加到我的连接中,这是我以前从未做过的。 – bdparrish

相关问题