@Html.DisplayFor(modelItem => item.InvoiceName)
|
@foreach (var items in item.ListProdukts)
{
@Html.DisplayFor(modelItem => items.ProduktId)
@Html.DisplayFor(modelItem => items.Produkts.ProduktName)
}
|
Почему не показывает ProduktName?
Ответ
Ответ дали на github. Оказывается ASP.NET Core теперь не добавляет дочерние элементы по умолчанию.
Подробно можно прочесть на английском здесь: docs.asp.net В моем случае в Controller надо добавить: в строку: var applicationDbContext = _context.Invoice.Include(c => c.ListProdukts).ThenInclude(c => c.Produkts);
вот это: .ThenInclude(c => c.Produkts);
Имеется ноутбук с установленным git 2.9.3. Есть аккаунт на Github и Bitbucket, зарегистрированный на один и тот же e-mail.
Могу ли я заливать одни проекты на Github, а другие Bitbucket?
И нужны ли дополнительные настройки при заливке на Bitbucket?
Ответ
"Заливка" (Отправление файлов и изменений из локального репозитория в удалённый) осуществляется по адресу, который указан в remote каждого локального репозитория. Когда вы клонируете репозиторий с удалённого сервера (Github или Bitbucket) то в репозиторий устанавливается remote с именем origin в котором указан этот адрес. При git push origin файлы/изменения отправятся на удалённый репозиторий с указанным адресом. При этом ничто не ограничивает вас в смене и добавлении других remote-ов. Т.е. вы можете склонировать репу с Github, поменять remote и пушить на Bitbucket. Или наоборот. А можете добавить ещё один remote для к-л репы и пушить и в Github и в Bitbucket.
В моем проекте не используется JQuery и bootstrap.js, так уж сложилось. Стараемся как можно меньше использовать библиотеки. Нужно реализовать модальное окно, но использовать вышеупомянутые JQuery и bootstrap.js ради одного окошка - крайне не желательно. Есть ли решение этой проблемы?
Ответ
Например самое простое с применением псевдокласса :target
/* Стили для модального*/
#modal {
display: none;
}
/* Изменяем вид вывода при соответствии */
#modal:target {
display: block;
}
/* Закрытие модального*/
.close {
position: absolute;
top: 1rem;
right: 1rem;
}
/* Доп. стилизация модального*/
#modal {
max-width: 300px;
height: 100px;
margin: 2rem auto;
border: 1px solid #ccc;
padding: 5rem 2rem;
text-align: center;
position: relative;
}
/* Стилизация кнопки, чтобы глаз радовала.*/
.btn {
width: 200px;
height: 34px;
line-height: 34px;
border: 1px solid #ccc;
border-radius: 25px;
color: #111;
background: #eee;
text-decoration: none;
display: block;
text-align: center;
position: relative;
}
вызвать модальное
x
Модальное окно
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Labore, quidem!
Псевдо класс :target является одной из замечательных особенностей
CSS3. Он соответствует элементу, на который указывает идентификатор в
URI документа.
Идентификатор в URI содержит символ “#”, за которым следует имя
идентификатора, соответствующее значению атрибута id элемента в
документе.
Имеется следующий результат вычислений: 1.103567 -0.015367 0.000616
-0.023323 1.138369 -0.018582
-0.003442 0.004548 1.195153
Устройство преобразует эти числа следующим образом: [1.104, -0.01537, 0.000616,
-0.02332, 1.138, -0.01858,
-0.003442, 0.004548, 1.195]
Для дальнейшей работы необходимо сравнивать вычисления и числа внутри устройства, поэтому возникла потребность в округлении результатов вычислений так же, как это делается на устройстве. Round не даёт удовлетворительного результата.
где m это DataFrame.
Ответ
Товарищ в комментариях подсказал еще один хороший способ, который при больших массивах данных гораздо более предпочтителен:
Итак, у нас имеется результат вычислений m и данные с устройства newmatrix. Их необходимо сравнить. import numpy as np
import pandas as pd m
0 1 2
0 1.099394 -0.015754 0.006890
1 -0.025979 1.119590 -0.002269
2 -0.021262 0.005393 1.191073 type(m)
newmatrix
[1.099, -0.01575, 0.00689, -0.02598, 1.12, -0.002269, -0.02126, 0.005393, 1.191] type(newmatrix)
Приводим newmatrix к формату DataFrame mat=np.array(newmatrix)
mat=mat.reshape((3,3))
mat=pd.DataFrame(mat) mat
0 1 2
0 1.09900 -0.015750 0.006890
1 -0.02598 1.120000 -0.002269
2 -0.02126 0.005393 1.191000
И затем одной функцией производим сравнение: numpy.allclose(m, mat, 1e-3,0)
True
Вопрос насчет permissions пользователя экземпляра sql сервера: Например есть у нас пользователь Vasiok, за ним закреплена роль sysadmin. Возможно ли ему закрепить permission вне зависимости от роли?? То-есть, я хочу чтобы он себе и далее был только sysadmin-ом, но кроме того у него еще был дополнительный permission. Если обобщить: могут ли существовать permissions отдельно от roles?
Ответ
могут ли существовать permissions отдельно от roles?
Да, могут. И существуют. В SqlServer есть иерархия разрешений. Разрешения сами по себе не зависят от ролей. Напротив - роль содержит некоторый набор разрешений (и/или запрещений). Есть встроенные роли, - такие как, например, sysadmin, - набор разрешений для них фиксирован и не может изменяться (т.н. fixed roles). Начиная с SqlServer 2012 можно создавать собственные роли уровня сервера, собирая в них необходимые наборы разрешений. Логин может быть в какой-то одной роли, может быть в нескольких ролях одновременно, может не быть ни в одной роли(*), и также может иметь разрешения, установленные напрямую, а не через членство в ролях. Допустим есть логин USE [master]
GO
CREATE LOGIN [LoginName] WITH PASSWORD = N'L2RG9mZi6EZm'
GO
Можно сделать его членом роли сервера sysadmin ALTER SERVER ROLE [sysadmin] ADD MEMBER [LoginName]
GO
но можно дать широкие права и явно GRANT CONTROL SERVER TO [LoginName]
GO
Членство в роли sysadmin и право CONTROL SERVER эквивалентны(**)
(*): строго говоря, любой логин всегда является членом специальной роли public, и отменить это нельзя.
(**): на самом деле - почти (из-за некоторых legacy вещей).
Есть mp4 файл, как я могу получить длительность видеозаписи?
Ответ
Получить длительность видео можно как: MediaPlayer mp = MediaPlayer.create(this, Uri.parse(uriOfFile));
int duration = mp.getDuration();
Источник
В общем, хочу сделать класс, который будет импортировать DataTable в Access или MS SQL. Класс будет иметь 1 метод: Append, которому на вход будет подаваться DataTable, а метод в свою очередь будет загружать DataTable в нужный пункт назначения. Разумеется, внутренняя логика Append у Access может сильно отличаться, например:
В Access нужно следить за тем, что бы файл не был выше 2гб, иначе бд поломается
В MS SQL можно воспользоваться BulkCopy, а в Access потребуется какой-то самопал.
Соответственно и конструкторы могут сильно отличаться по параметрам, например:
Строки подключения между двумя типами будут отличаться
В MS SQL можно использовать или не использовать транзакцию
В Access можно восстанавливать или не восстанавливать БД после каждого Append.
Как лучше всего все это оформить? UPD: Есть у меня некоторые предположения, как это можно сделать, но не знаю на сколько это верно. Сделать интерфейс: public interface IApend
{
void Append(DataTable dt);
}
Реализовать его в 2 ух классах, каждый из которых будет содержать в себе собственную логику импорта: public class ImporterToSQL: IApend
{
//Какие-то поля
public void Append(DataTable dt)
{
//Какая-то логика
}
}
public class ImporterAccess : IApend
{
//Какие-то поля
public void Append(DataTable dt)
{
//Какая-то логика
}
}
И создать такой класс: public class Importer
{
IApend Concrete; public Importer(IApend concrete)
{
Concrete = concrete;
}
static Importer ImporterToSQL(object v,object v2,object v3)
{
return new Importer(new ImporterToSQL(object v, object v2, object v3));
}
static Importer ImporterToSQL(object v, object v2)
{
return new Importer(new ImporterToSQL(object v, object v2));
}
static Importer ImporterToAccess(object v, object v2, object v3)
{
return new Importer(new ImporterAccess(object v, object v2, object v3)));
}
static Importer ImporterToAccess(object v, object v2)
{
return new Importer(new ImporterAccess(object v, object v2));
}
public void Append(DataTable dt)
{
Concrete.Append(dt);
}
}
На сколько это верно и на сколько хорошо этот подход будет работать в плане добавления нового функционала(Например, мне приспичило добавить импорт из SQL в Access)? Это , вроде, зовется фабрикой классов?
Ответ
Вы на правильном пути. Общий интерфейс для конвертации -- это правильно. Только я бы назвал его чуть поконкретнее, хотя б IImporter какой-нибудь. Что касается создания конкретных экземпляров и вашего класса Importer. Для создания действительно нужна фабрика. Однако она у вас получилась не в чистом виде. Смысла оборачивать экземпляр в ваш Importer нет -- у вас уже есть интерфейс. Просто создавайте нужные экземпляры и возвращайте их. А клиент уже будет вызывать напрямую методы: public static class ImporterFactory
{
static IImporter CreateSQLImporter(object v, object v2, object v3)
{
return new ImporterToSQL(v, v2, v3);
} static IImporter CreateAccessImporter(object v, object v2, object v3)
{
return new ImporterAccess(v, v2, v3);
} // и так далее
}
В качестве параметров для конструкторов у вас наверняка выступают специфичные для каждой реализации данные: например, строка подключения для SQL и путь к mdb файлу для Access. В идеале клиент вообще не должен знать что-то о деталях реализации, а фабрика должна содержать один метод на тип. Все детали о реализации прячутся в фабрике, которая подсовывает нужные параметры напрямую из конфигурации (например, из app.config). При этом клиент вообще ничего не будет знать о реализации: public static class ImporterFactory
{
static IImporter CreateImporter(object v)
{
var generalConfig = GetGeneralConfig();
if (generalConfig.Type == "sql")
{
var config = GetSqlImporterConfig();
return new ImporterToSQL(config.ConnectionString, v);
}
else if (generalConfig.Type == "access")
{
var config = GetAccessImporterConfig();
return new ImporterToAccess(config.ConnectionString, v);
}
}
}
Такой подход будет очень хорошо работать, если вам потребуется импорт в новое место. Вы просто напишете еще одну реализацию IImporter, внести изменения в ImporterFactory и все. Все клиентs, которые используют IImporter, менять не придется. В случае же отдельных методов вам придется менять вызывающий код, который управляет тем, какой метод вызвать.
Что касается импорта из SQL в Access, то такую задачу описанным выше способом не решить. Выше мы рассмотрели только задачу "как данные, представленные в универсальном виде (DataTable), записать в конкретное место". Задачу импорта из SQL в Access можно переформулировать как "как извлечь данные из одного места и записать их в другое место". Такую задачу полезно разбить на два шага и ввести промежуточный этап. Какой? Правильно, получение данных в универсальном виде. Таким образом, шага будет два:
Импорт из источника с преобразованием в универсальный вид
Экспорт в другое место
Соответственно, два основных контракта будут выглядеть как-то так: interface IImporter
{
DataTable Import();
} interface IExporter
{
void Export(DataTable data);
}
Реализация второго шага у вас уже есть, правда сейчас она называется импортом. При наличии двух шагов будет логичнее назвать их с т.з. того, как данные движутся относительно вашего приложения. Вы импортируете (загружаете) данные из одного источника и экспортируете (выгружаете) их в другое место. Реализация первого шага будет аналогична -- различные реализации интерфейсов, фабрика. Для осуществления процесса конвертации вам понадобится некоторая общая сущность, которая будет соединять шаги. Она может принимать в качестве зависимостей как фабрики, так и экземпляры импортера/экспортера: public class DataConverter // придумайте имя поудачнее, пожалуйста :)
{
private readonly IImporter _importer;
private readonly IExporter _exporter; public DataConverter(IImporter importer, IExporter exporter)
{
_importer = importer;
_exporter = exporter;
} public void Convert()
{
var data = _importer.Import();
_exporter.Export(data);
}
}
Требуется собрать проект с помощью bat-файла. Параметры сборки следующие: MsVstudio\incredibuilder - тип сборки локальная\распределенная
win32\x64
debug elease
build ebuild
Можно ли как-то при запуске VS передать в неё такие параметры? Читал про команду devenv, она даёт возможность только указать Build или Rebuild.
Ответ
В общем локальная сборка делается с помощью MSBuild, как мне посоветовали выше. Полный пример: msbuild.exe %SolutionPath% /t:build /p:configuration=release /p:platform=x86
Запускается из Bat, только после перехода в каталог, в котором находится MSBuild. Распределённая сборка, через IncrediBuild, делается через BuildConsole: BuildConsole.exe %SolutionPath% /build /cfg="release|x86"
Является командой самой windows cmd, так что ничего придумывать не надо.
|