Я думаю, что эта объектная модель - то, что вы ищете:
public class Team
{
public int TeamId { get; set; }
public ICollection<Player> TeamMembers { get; set; }
public Player CreatedBy { get; set; }
}
public class Player
{
public int PlayerId { get; set; }
public Team Team { get; set; }
}
public class Context : DbContext
{
public DbSet<Player> Players { get; set; }
public DbSet<Team> Teams { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Player>()
.HasOptional(p => p.Team)
.WithMany(t => t.TeamMembers)
.Map(c => c.MapKey("TeamId"));
// Or alternatively you could start from the Team object:
modelBuilder.Entity<Team>()
.HasMany(t => t.TeamMembers)
.WithOptional(p => p.Team)
.Map(c => c.MapKey("TeamId"));
}
}
Кстати, следующий свободный код API, который вы используете, неверен:
...HasOptional(x => x.TeamMembers)
Потому что TeamMembersявляется коллекцией и не может использоваться HasOptional методом, который всегда должен вызываться с одним объектом.
Обновление - HasRequired против HasOptional:
Хотя они оба установленыв сопоставлении они дают несколько разные результаты и предъявляют различные требования:
Если это сопоставление FK (свойство FK предоставляется зависимому объекту), тогда оно должно иметь тип NULL, еслипри использовании HasOptional и ненулевого типа при использовании HasRequired или будет выдан Code First.
Code First автоматически включит каскадное удаление при использовании HasRequired метод.
Другое отличие заключается в поведении во время выполнения EF, когда дело доходит до удаления.Рассмотрим сценарий, в котором мы хотим удалить главный объект (например, Team
), пока у него есть зависимый объект (например, Player
), а каскадное удаление отключено.С помощью HasOptional среда выполнения EF автоматически обновит зависимый столбец FK до нуля, а с HasRequired EF сгенерирует запрос и попросит вас либо явно удалить зависимый объект, либо связать его с другим основным объектом (еслиесли вы хотите попробовать это, вы должны знать, что в обоих случаях и главный, и зависимый объекты должны быть уже загружены в контексте, чтобы EF отслеживал их).