Давайте представим несколько конкретных классов, чтобы проиллюстрировать решения:
public class Account
{
public long ID { get; set; }
public virtual User User { get; set; }
}
public class User
{
public long ID { get; set; }
public virtual Account Account { get; set; }
public virtual Team Team { get; set; }
}
public class Team
{
public long ID { get; set; }
public long CompanyID { get; set; }
public virtual Company Company { get; set; }
public virtual ICollection<User> Users { get; set; }
}
public class Company
{
public long ID { get; set; }
}
Я использую вспомогательный класс, чтобы сделать классы отображения менее подробными:
internal abstract class AbstractMappingProvider<T> : IMappingProvider where T : class
{
public EntityTypeConfiguration<T> Map { get; private set; }
public virtual void DefineModel( DbModelBuilder modelBuilder )
{
Map = modelBuilder.Entity<T>();
Map.ToTable( typeof(T).Name );
}
}
Теперь о отображениях. Давайте сначала сделаем отображение "1:1". В моем примере пользователь и учетная запись связаны 1:1 и имеют один и тот же первичный ключ (только один из них будет столбцом идентификации, которым в данном случае является Account.ID).
internal class UserMapping : AbstractMappingProvider<User>
{
public override void DefineModel( DbModelBuilder modelBuilder )
{
base.DefineModel( modelBuilder );
Map.HasRequired( e => e.Account ).WithRequiredDependent( r => r.User ).WillCascadeOnDelete( true );
}
}
internal class AccountMapping : AbstractMappingProvider<Account>
{
public override void DefineModel( DbModelBuilder modelBuilder )
{
base.DefineModel( modelBuilder );
Map.HasRequired( e => e.User ).WithRequiredPrincipal( r => r.Account ).WillCascadeOnDelete( true );
}
}
В следующих сопоставлениях мы указываем, что в команде есть (0..n) пользователей, в то время как один пользователь находится ровно в одной команде (обязательно). Мы также указываем, что у команды может быть компания, но компания не выставляет список команд.
internal class TeamMapping : AbstractMappingProvider<Team>
{
public override void DefineModel( DbModelBuilder modelBuilder )
{
base.DefineModel( modelBuilder );
Map.HasOptional( e => e.Company ).WithMany().HasForeignKey( e => e.CompanyID );
Map.HasMany( e => e.Users ).WithRequired( r => r.Team );
}
}
internal class CompanyMapping : AbstractMappingProvider<Company>
{
public override void DefineModel( DbModelBuilder modelBuilder )
{
base.DefineModel( modelBuilder );
}
}
Надеюсь это поможет!
person
Morten Mertner
schedule
20.03.2011