2011-03-06 131 views
1

我還有一個關於EF4的問題:)抱歉,我在網上找不到任何東西。實體框架4.0 CTP5多對多關係附帶幫助表?

問題是我使用CTP5 Code Only來映射(多對多),我該怎麼做?

但我做舊時尚的方式,我的意思是我有三個表:

  1. 用戶
  2. 公司。
  3. UsersToCompanies - >(用戶ID,CompanyId)

如何映射這一點,就會非常感激如果你想從POCO的 告訴我的代碼示例它,映射。


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

這裏的錯誤,我得到:

「((新 系統。 Linq.SystemCore_EnumerableDebugView(ctx.FindAll() 。))的項目[0])公司 投擲類型的異常 'System.Data.EntityCommandExecutionException'

內部異常:ORA-00942:表或 視圖不存在

+0

請不要添加一個答案,以添加內容到您的問題。您可以使用[編輯](http://stackoverflow.com/posts/5210506/edit)鏈接來執行此操作。您也可以在您自己的問題(任何問題/答案在50代表)的問題留下意見,以通知人們的更新。 – Will 2011-03-07 13:00:19

+0

另外,你對Oracle使用這個嗎?啊。從例外情況可以明顯看出,您添加的內容幾乎都不會對您的問題有用。你有連接/數據庫/安全問題。您需要對連接字符串和數據庫進行雙倍和三倍檢查。另外,[看到這個問題](http://stackoverflow.com/questions/189557/ora-00942-table-or-view-does-not-exist-how-do-i-find-which-table-or-視圖-IT-是);它是Java,但同樣的錯誤。如果您使用的是SQL Server,我會告訴您啓動Profiler並觀察連接和查詢;不知道oracle的等價物。 – Will 2011-03-07 13:06:15

+0

我不認爲這是一個Oracle問題,它更多的是一個不正確的配置 – IamStalker 2011-03-07 14:48:03

回答

0

我的問題的答案,我不得不說非常感謝對你們來說,但Devart的安德烈, 給了我解決方案,這很簡單。

首先我必須有,三家表企業,用戶,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"); 
      }); 

謝謝大家。

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

而這應該做到這一點。只要您在兩個POCO中都有一個引用其他實體的虛擬ICollection,CTP5的約定就應該爲您處理所有事情。另一方面,如果你喜歡手動使用Fluent API來做,那麼檢查this blog by the ADO.NET team(向下滾動到多對多關係部分)