实体框架4.0 CTP5与帮助表的多对多关系?

时间:2011-03-06 12:38:23

标签: c#-4.0 entity-framework-4 ora-00942

我有一个关于EF4的问题:)抱歉我在网上找不到任何东西。

问题是我使用CTP5 Code Only来映射(多对多),我该怎么办?

但我正在做旧时尚的方式,我的意思是我有三张桌子:

  1. 用户
  2. 公司。
  3. UsersToCompanies - > (UserId,CompanyId)
  4. 我如何映射这个,如果您向我展示代码示例,我将非常感激, 从POCO到Mapping。


    enter image description here

    这是我收到的错误......

    This is my entities
    public class User 
    {
       public int UserId { get; set; }
       public int? UserRoleId { get; set; }
       public string UserName { get; set; }
       public string UserPassword { get; set; }
       public DateTime InsertDate { get; set; }
       public virtual UserRole UserRole { get; set; }
    
       //this is my many to many prop
       public virtual ICollection<Company> Companies { get; set; }
    }
    
    public class Company
    {
       public int CompanyId { get; set; }
       public string CompanyNameHe { get; set; }
       public string CompanyNameEn { get; set; }
       public string CompanyParent { get; set; }
       public DateTime InsertDate { get; set; }
    
       //this is my many to many prop
       public virtual ICollection<User> Users { get; set; }
    }
    
    /*relationship map*/
    public class UsersCompanies
    {
       public int Id { get; set; } 
       public int UserId { get; set; } 
       public int CompanyId { get; set; } 
    }
        //mapping
     public class CompanyMap :  BaseConfig<Company>
     {
        public CompanyMap()
        {
            /*Identity*/
            HasKey(c => c.CompanyId);
            Property(c => c.CompanyId).HasDatabaseGenerationOption(DatabaseGenerationOption.Identity).HasColumnName("COMPANY_ID");
    
            /*Have default values*/
            Property(c => c.InsertDate).HasDatabaseGenerationOption(DatabaseGenerationOption.Computed).HasColumnName("INSERT_DATE");
    
            /*simple scalars*/
            Property(c => c.CompanyNameHe).HasMaxLength(32).IsRequired().HasColumnName("COMPANY_NAME_HE");
            Property(c => c.CompanyNameEn).HasMaxLength(32).IsRequired().HasColumnName("COMPANY_NAME_EN");
            Property(c => c.CompanyParent).HasMaxLength(32).IsRequired().HasColumnName("COMPANY_PARENT");
            ToTable("CMS_COMPANY", "GMATEST");
        }
     }
    
    
    public class UserMap : BaseConfig<User>
    {
       public UserMap()
       {
           /*Identity*/
           HasKey(c => c.UserId);
           Property(c => c.UserId).HasDatabaseGenerationOption(DatabaseGenerationOption.Identity).HasColumnName("USER_ID");
    
           /*Have default values*/
           Property(c => c.InsertDate).HasDatabaseGenerationOption(DatabaseGenerationOption.Computed).HasColumnName("INSERT_DATE");
    
           /*simple scalars*/
           Property(c => c.UserName).HasMaxLength(25).IsRequired().HasColumnName("USER_NAME");
           Property(c => c.UserPassword).HasMaxLength(25).IsRequired().HasColumnName("USER_PASSWORD");
           Property(c => c.UserRoleId).IsRequired().HasColumnName("USER_ROLE_ID");
    
           /*relationship*/
           HasRequired(u => u.UserRole).WithMany().HasForeignKey(t => t.UserRoleId);
    
    
           HasMany(p => p.Companies).WithMany(c => c.Users).Map(mc =>
           {
               mc.ToTable("UsersCompanies");
               mc.MapLeftKey(p => p.UserId, "CompanyId");
               mc.MapRightKey(c => c.CompanyId, "UserId");
           });
           ToTable("CMS_USERS", "GMATEST");
       }
    }
    
    public class UsersCompaniesMap : BaseConfig<UsersCompanies>
    {
       public UsersCompaniesMap()
       {
           /*Identity*/
           HasKey(k => k.Id);
           Property(c => c.Id).HasDatabaseGenerationOption(DatabaseGenerationOption.Identity).HasColumnName("ID");
    
           Property(c => c.UserId).IsRequired().HasColumnName("USER_ID");
           Property(c => c.CompanyId).IsRequired().HasColumnName("COMPANY_ID");
    
           ToTable("CMS_USERS_TO_COMPANIES", "GMATEST");
       }
    }
    

    这是我得到的错误:

      

    “((新   System.Linq.SystemCore_EnumerableDebugView(ctx.FindAll()))。项[0])。公司以   抛出了类型的例外   'System.Data.EntityCommandExecutionException'

         

    内部异常:ORA-00942:表格或   视图不存在

2 个答案:

答案 0 :(得分:1)

您实际上不需要3个表来执行映射。您可以简单地执行以下操作:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Company> Companies { get; set; }
}

public class Company
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

这应该这样做。只要您有一个虚拟ICollection引用POCO中的另一个实体,CTP5的约定应该为您处理所有事情。另一方面,如果您更喜欢使用Fluent API手动执行此操作,请检查this blog by the ADO.NET team(向下滚动到多对多关系部分)

答案 1 :(得分:0)

我的问题的答案,我不得不说非常感谢你们所有人,但来自Devart的安德烈, 给了我解决方案,很简单。

首先,我必须拥有三个表公司,用户,用户公司/

关闭所有我必须将表映射到表的原始名称示例: 我在Db中调用的用户表是这样的:CMS_USERS我必须用原始名称映射它。 这是我使用的例子,它确实有用。

HasMany(c => c.Companies)
          .WithMany(u => u.Users)
          .Map(mc =>
          {
              mc.ToTable("CMS_USERS_TO_COMPANIES", "GMATEST");
              mc.MapLeftKey(c => c.UserId, "USER_ID");
              mc.MapRightKey(u => u.CompanyId, "COMPANY_ID");
          });

谢谢大家。