1

我再次对 EF4 有疑问 :) 抱歉,我在网上找不到任何东西。

问题是我只使用 CTP5 代码来映射(多对多),我该怎么做???

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

  1. 用户
  2. 公司。
  3. UsersToCompanies -> (UserId, CompanyId)

我如何映射它,如果您能向我展示从 POCO 到 Mapping 的代码示例,我将不胜感激。


在此处输入图像描述

这是我收到的错误...

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");
   }
}

这是我得到的错误:

'((new System.Linq.SystemCore_EnumerableDebugView(ctx.FindAll())).Items[0]).Companies' 引发了“System.Data.EntityCommandExecutionException”类型的异常

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

4

2 回答 2

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 手动执行此操作,请查看ADO.NET 团队的此博客(向下滚动到多对多关系部分)

于 2011-03-06T13:31:39.133 回答
0

我的问题的答案,我要非常感谢你们,但是来自 Devart 的 Andrey 给了我解决方案,很简单。

首先,我必须拥有三张表 Companies、Users、UsersCompanies/

其次,我必须将表映射到表的原始名称示例:我的用户表在 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");
          });

谢谢你们。

于 2011-03-12T21:20:01.057 回答