Ответы пользователя по тегу Entity Framework
  • Правильная архитектура при построение Web приложения?

    @kttotto
    пофиг на чем писать
    Архитектура никак не зависит от стека.
    5e6ddff504334597793261.png
    Где здесь, хоть что-то указывает на стек?
    При "правильной архитектуре" каждая часть может быть написана на чем угодно (в пределах разумного, конечно) и все будет работать как часы.
    Ответ написан
    Комментировать
  • EF Core Загрузка трёх и более сущностей. Как правильно?

    @kttotto
    пофиг на чем писать
    1.
    Есть просто номер, который соответствует id в таблице Скана.

    Где есть номер, в какой таблице? Какая-то же связь должна быть между сотрудником и договором? Иначе просто будет невозможно соотнести запись договора с записью сотрудника.

    2. Не лучшее решение на вьюшку отдавать entity сущность. Лучше добавить модель DetailsViewModel, которую Вы заполните данными как хотите. Например
    var detailsViewModel = db.employees.Include(ep => ep.Position)                
    			.Where(j => j.Id == id)
    			.Select(emp => new EmploeeViewModel
    			{
    				Name = emp.Name,
    				Position = emp.Position,
    				Сontract = db.Contract.FirstOrDefault(c => c.Id == emp.ContractId)
    			}.FirstOrDefault();
    			
    return View(detailsViewModel);
    Ответ написан
    1 комментарий
  • Что изучать ADO NET или Entity Framework?

    @kttotto
    пофиг на чем писать
    Не знаю, что за "умный" модератор посчитал, что этот вопрос Стоит ли использовать ADO .NET взамен Dapper и EF Core? тоже самое, что текущий. Суть вопросов абсолютно разная, хоть у буквы у некоторых слов одинаковые. Поэтому отвечаю sergeyiljin на его вопрос.

    На все должен быть смысл. EF и Dapper (и вообще ORM) создавались не "от нечего делать", в них была потребность. Хорошая ORM в нужном месте облегчает жизнь разработчику как в разработке кода, так и в его поддержке. Сейчас наоборот стараются максимально абстрагироваться от использования чистого sql и хранимок на бд, все-таки удобнее, работать с кодом в одном месте - и дебажить, и поддерживать в разы проще. И если работаете в ООП парадигме, то удобнее чтобы данные тоже были приближены к объектному виду. Поэтому если Вы не в жестком интерпрайзе и хайлоаде, то нет смысла уходить в прошлое. Знаю один крупный банк, который год назад искал нового разраба на существующий проект документооборота, где надо было все хранимки, более 5к, и sql в коде, перевести в EF. Наверное же не просто так они приняли такое решение.
    Ответ написан
    Комментировать
  • Как создать экземпляр контекста базы данных?

    @kttotto
    пофиг на чем писать
    Передавать в конструктор надо экземпляр DbContextOptions.
    Это можно делать либо руками, либо с помощью DI
    док
    В простом варианте руками это будет выглядеть так:
    var timeout = 600;
    var optionsBuilder = new DbContextOptionsBuilder<InstituteContext>()
    	.UseSqlServer(new SqlConnection(connectionString), opt =>
    	{
    		opt.CommandTimeout(timeout);
    	});
    	
    using (var context = new InstituteContext (optionsBuilder.Options))
    {
      // your code
    }
    Ответ написан
  • Зацикливание при загрузке связанной сущности, как исправить?

    @kttotto
    пофиг на чем писать
    Попробуй вместо Include использовать Load
    Ответ написан
  • .NET Core Web Api EF Как сделать группировку значений в запросе?

    @kttotto
    пофиг на чем писать
    GroupBy по сути Вам вернет массив массивов, к List привести Вы его не сможете, можете привести к Dictionary, например
    var orders = db.Orders
                    .Where(x => x.Kod == kod)
                    .GroupBy(x => x.Nomenklatura)
                    .ToDictionary(x => x.FirstOrDefault().Nomenklatura, x => x.ToList() )

    тогда получить сгруппированное можно по ключу
    orders["anyNomenklatura"]
    и там будет список
    Ответ написан
  • Как кикнуть пользователя в ASP.NET Identity?

    @kttotto
    пофиг на чем писать
    Есть несколько способов:
    1) Если это asp.mvs, то переопределить атрибут Authorize, в ней делать проверку пользователя по какому то полю IsBlackList.
    2) Если это так же asp.mvs, то наверняка Вы поле IsBlackList добавили в Claim, значит авторизацию можно делать на основе Claims и методы помеченные этим атрибутом, будут отсеивать заблокированных. Подробно тут.
    3) Если это asp core, то все тоже самое делается на основе политик безопасности, примеры так же тут.
    4) Но как по мне, то самый простой способ, это при блокировке менять роль пользователю и соответственно контроллеры должны быть помечены теми политиками, в которые не входит роль заблокированного. Этого должно хватить, после блокировки, первый же запрос проверит роль и переадресует на страницу логина.
    Ответ написан
    Комментировать
  • Объект с полями (one-to-many) возвращается со значением null в полях в Entity Framework, как это решить?

    @kttotto
    пофиг на чем писать
    Обратите внимание в документации EF на метод Include(), зачем он нужен и что он делает.
    Если Вам нужно, чтобы при запросе Word, кроме данных самой сущности, еще подтянулись зависимые, нужно сделать так
    var word = db.Words.Include(x => x.LearnDay).Where(p => p.Id == testId).FirstOrDefault();
    Ответ написан
    Комментировать
  • Как получить роль, начинающуюся с определенных символов?

    @kttotto
    пофиг на чем писать
    Если это Core, то использовать политики, что-то примерно
    public void ConfigureServices(IServiceCollection services)
    {
    	services.AddAuthorization(x => 
    	{
    		x.AddPolicy("RoleStartWith", policy => { 
    				policy.RequireRole(roles.Where(r => r.StartsWith("ad")));
    			});
    	});
    }
    
    [Authorize(Policy = "RoleStartWith")]
    public IActionResult Index()
    {
    	return View();
    }

    Если это, например, MVC5, то можно использовать кастомный атрибут как то так:
    public class CustomAutorizeAttribute : AuthorizeAttribute
    {
    	private string _prefix;
    	private string[] _roles;
    
    	public CustomAutorizeAttribute(string prefix)
    	{
    		_prefix = prefix;
    		_roles = base.Roles.Split(',').Select(x => x.Trim()).ToArray();
    	}
    
    	protected override bool AuthorizeCore(HttpContextBase httpContext)
    	{
    		return _roles.Where(x => x.StartsWith(_prefix)).Any(x => httpContext.User.IsInRole(x));
    	}
    }
    
    [CustomAutorize(prefix = "ad")]
    public IActionResult Index()
    {
    	return View();
    }

    Писал все на коленке в блокноте, руками не проверял, но основная мысль, надеюсь, понятна.
    Ответ написан
    Комментировать
  • Как смапить свойство типа 'Dictionary' в Entity Framework?

    @kttotto
    пофиг на чем писать
    Вы в одном поле собираетесь хранить целай массив? А потом, чтобы достать одно значение будете читать весь массив из поля?
    Это не верный подход, но можно реализовать сериализацией массива в json при записи и при чтении - десериализацией. Например:

    public class VmWord
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Localization { get; set; }
    
        [NotMapped]
        public Dictionary<string, string> Localizations 
        {
            get { return JsonConvert.DeseriazeObject<Dictionary<string, string>>(Localization.ToList()); }
            set { Localization = JsonConvert.SerializeObject(value); }
        }
    }

    Но верный подход будет по другому:

    public class VmWord
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual List<string> Localizations { get; set; }
    }
    
    public class Localization
    {
        public int Id { get; set; }
        public string Key { get; set; }
        public string Value { get; set; }
        public virtual VmWord VmWord { get; set; }
    }

    И достать по ключу потом:

    context.VmWord.Localizations.FirstOrDefault(x => x.Key == key)?.Value;
    Ответ написан
    Комментировать
  • Как узнать порядковый номер строки в столбце(Entity Framework С#)?

    @kttotto
    пофиг на чем писать
    В бд строки могут лежать в любом непредсказуемом для Вас порядке. И какая строка на каком месте находится, Вас интересовать не должно. То, что Вы видите строки в каком то порядке, это сортировка по дефолту. Если Вы хотите взять порядковый номер строки, то нужно указать порядковый номер относительно какого то поля, т.е. таблицу прежде надо отсортировать по нужному полю (Id, DateTime, Name и т.д.), а потом можете брать запись отсчитывая с любого конца. Поэтому это примерно будет выглядеть так
    bd.User.OrderBy(x => x.Id).ElementAt(5);
    Если надо именно порядковый номер узнать определенной записи, то можно так
    bd.User.OrderBy(x => x.Id).ToList().FindIndex(x => x.Name == "Vasya");
    Ответ написан
    1 комментарий
  • Как задать максимальный уровень для навигационный свойств при использовании include?

    @kttotto
    пофиг на чем писать
    Если Вы пытаетесь сериализовать ef объект в json, то JsonConvert в этом случает будет рекурсией обходить все поля внутри и конечно в какой то момент зациклится. Для таких случаев обычно мапят ef объект на свою модель и уже ее и сериализуют.

    Еще вот здесь есть такой вариант
    return JsonConvert.SerializeObject(results, Formatting.Indented, 
    new JsonSerializerSettings { 
        ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
    });
    Ответ написан
    1 комментарий
  • Есть ли польза в частичном переходе с EntityFramework на sql запросы?

    @kttotto
    пофиг на чем писать
    Для оптимизации - имеет смысл, это действительно ускорит сложные запросы. Разницы нет, сколькими способами Вы будете доставать данные из бд в контроллере. Сборка загрузится один раз, и если она будет висеть без дела, погоды это не сделает. Вы можете сделать дополнительную прослойку Репозитория между бд и контроллером и внутри наделать методов которые будут хоть через EF, хоть через ADO.NET, или еще через что доставать данные.
    Ответ написан
    Комментировать
  • Как выбрать уникальные значение из результатов поиска?

    @kttotto
    пофиг на чем писать
    db.Library.Where(x => x.FIO == "Антонов Антон Антонович").GroupBy(x => x.KNIGI).Select(x => x.First())
    Ответ написан
  • Почему не получается обновить одно поле в EF?

    @kttotto
    пофиг на чем писать
    Вы ее присоединили к контексту, но обновления не происходит. Попробуйте явно указать, что модель модифицирована
    this.Db.Entry(Phone).State = EntityState.Modified;
    this.Db.SaveChanges();
    Ответ написан
    Комментировать
  • Как реализовать фильтрацию записей на основе SQL подобного текста?

    @kttotto
    пофиг на чем писать
    Надо писать свою грамматику и анализатор под него, который будет генерировать нормальный sql запрос. Мы применяли antlr4cs
    Ответ написан
    Комментировать
  • Как использовать ASP.NET Identity в CMS?

    @kttotto
    пофиг на чем писать
    В EF core нет model first, только code first и database first, хотя может за последний год что-то и поменялось. Identity настраивается по своему вкусу, все достаточно гибко. Последние годы использовал только кодфёст, собственно это рекомендуемый способ. Бд обновляются миграциями, туториалов в сети полно как, можно самому код написать, можно сгенерировать на основе разницы бд.
    Ответ написан
    Комментировать
  • Пишу таск-менеджер на ASP.NET. Как реализовать подсчёт времени выполнения задачи?

    @kttotto
    пофиг на чем писать
    Для замера времени работы обычно используется Stopwatch.

    А вообще не совсем понятен вопрос, если Вы вроде как все организовали. Что Вас не устраивает?
    Ответ написан
    Комментировать
  • Как правильно в ASP .NET и EF организовать обновление объекта?

    @kttotto
    пофиг на чем писать
    Ответ написан
    Комментировать
  • Новичку учить EF или ADO.NET?

    @kttotto
    пофиг на чем писать
    EF проще в употреблении и в освоении я считаю тоже. Но с EF становится трудно, когда приложению требуется справляться с большой нагрузкой запросов, приходится выкручиваться, что-то придумывать, поэтому там чаще всего используют чистый ADO.NET.
    Ответ написан
    Комментировать