Я нашел решение, которое работает (с использованием DTO и AutoMapper), которое воспроизводится ниже, но я бы предпочел ответ, который перечисляет различные подходы к проблеме с примерами, и это будет отмечено как ответ, если он получен.
В моей модели сущности у меня есть свойство навигации, которое переходит от дочернего объекта к родительскому объекту. Мой проект работал плавно. Затем я начал использовать AutoFixture для модульного тестирования, а тестирование завершилось неудачно, AutoFixture заявила, что у меня есть круговая ссылка.
Теперь я понимаю, что такие свойства кольцевой эталонной навигации, как это, находятся в порядке внутри Entity Framework, но я нашел это сообщение (Использовать значение родительского свойства при создании сложного дочернего элемента в AutoFixture), где Марк Семанн, создатель AutoFixture, утверждает:
"Для записи я не писал API с круглой ссылкой в течение многих лет, поэтому вполне можно избежать этих отношений родителя/ребенка".
Итак, я хочу понять, КАК модель домена может быть реорганизована, чтобы избежать отношений с дочерними/родительскими.
Ниже приведены классы сущностей, метод репозитория, и как я использую свойство, вызывающее циклическую ссылку в моем представлении. Идеальный ответ объяснял бы различные варианты, которые я мог бы выбрать с примерами, и основные плюсы/минусы каждого подхода.
Примечание. Свойство, вызывающее циклическую ссылку, является User, в модели UserTeam.
Модели:
public class UserProfile
{
public UserProfile()
{
UserTeams = new HashSet<UserTeam>();
Games = new HashSet<Game>();
}
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
public virtual ICollection<UserTeam> UserTeams { get; set; }
public virtual ICollection<Game> Games { get; set; }
}
public class Game
{
public Game()
{
UserTeams = new HashSet<UserTeam>();
}
public int Id { get; set; }
public int CreatorId { get; set; }
public virtual ICollection<UserTeam> UserTeams { get; set; }
}
public class UserTeam
{
public UserTeam()
{
UserTeam_Players = new HashSet<UserTeam_Player>();
}
public int Id { get; set; }
public int UserId { get; set; }
public int GameId { get; set; }
public virtual UserProfile User { get; set; }
public virtual ICollection<UserTeam_Player> UserTeam_Players { get; set; }
}
Метод репозитория
public IEnumerable<Game> GetAllGames()
{
using (DataContext)
{
var _games = DataContext.Games
.Include(x => x.UserTeams)
.Include(x => x.UserTeams.Select(y => y.User))
.ToList();
if (_games == null)
{
// log error
return null;
}
return _games;
}
}
Вид
@model IEnumerable<Game>
@foreach (var item in Model){
foreach (var userteam in item.UserTeams){
<p>@userteam.User.UserName</p>
}
}
Теперь, если я удалю свойство навигации "Пользователь", я не смог бы выполнить "@userteam.User.UserName"
Итак, как мне реорганизовать модель домена, чтобы удалить круговую ссылку, имея возможность легко прокручивать игры и делать что-то вроде UserTeam.User.Username?