Entity Framework 4.0 CTP5 Отношение ко многим ко многим поставляется с помощью справочной таблицы?
У меня снова вопрос об EF4:) Извините, я не могу найти ничего в сети.
Вопрос в том, что я использую CTP5 Code Only для отображения (многие на многие), как мне это сделать???
Но я делаю по-старому, я имею в виду три стола:
- пользователей
- Компании.
- 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");
}
}
Вот ошибка, которую я получаю:
'((новый System.Linq.SystemCore_EnumerableDebugView(ctx.FindAll())).Items[0]). Компании выдали исключение типа'System.Data.EntityCommandExecutionException'
Внутреннее исключение: ORA-00942: таблица или представление не существует
2 ответа
Ответ на мою проблему, я должен сказать большое спасибо всем вам, но Андрей из 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");
});
Спасибо вам всем.
Вам не нужно 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 (прокрутите немного вниз до раздела отношений "многие ко многим").