通常,有一个服务类需要在构造函数中使用 CancellationToken。
我可以仅在默认的常规 .NET Core 容器中注册它,还是可以获得一些与应用程序生命周期相关的真实令牌?
我通过 CreateDefaultBuilder 创建主机
通常,有一个服务类需要在构造函数中使用 CancellationToken。
我可以仅在默认的常规 .NET Core 容器中注册它,还是可以获得一些与应用程序生命周期相关的真实令牌?
我通过 CreateDefaultBuilder 创建主机
一般来说,有一个 Angular 项目托管在:http://localhost:2021/
当转到根 http://localhost:2021/ 时,它重定向到 http://localhost:2021/projects
现在我在这个地址运行另一个站点,但是 Chrome 将我重定向到 http://localhost:2021/projects,因为我从缓存中理解它......我按 CTRL + F5,但缓存没有被它清除...我不想完全清除所有站点的缓存。
问题是顶部是嵌套在主网格中的单独网格(3 列),底部是嵌套在主网格中的 GroupBox。
从理论上讲,我可以将所有这些合并到 1 个网格中,但是由于 GroupBox 仍然会有轻微的差异......
标记:
<Window x:Class="DictionaryCreator.UI.Windows.DictionaryConfigurationWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DictionaryCreator.UI.Windows"
xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
mc:Ignorable="d"
Title="Конфигурация справочника" Height="680" Width="800">
<Grid >
<Grid.Resources >
<Style TargetType="Border" >
<Setter Property="Padding" Value="5,5,5,5" />
</Style>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition ></ColumnDefinition>
<ColumnDefinition ></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<Grid Grid.Row="0" ColumnSpan="2" DataContext="{Binding DictConfigVM}">
<Grid.ColumnDefinitions>
<ColumnDefinition ></ColumnDefinition>
<ColumnDefinition ></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<Border Grid.Row="0" Grid.Column="0">
<Label HorizontalContentAlignment="Right">Тип базы данных</Label>
</Border>
<Border Grid.Row="0" Grid.Column="1">
<ComboBox ItemsSource="{Binding Path=DbKinds}" DisplayMemberPath="Name" SelectedValue="{Binding Path=SelectedDbKind}"/>
</Border>
<Border Grid.Row="1" Grid.Column="0" >
<Label HorizontalContentAlignment="Right">Сервер (MSSQL) или путь к файлу (MS ACCESS)</Label>
</Border>
<Border Grid.Row="1" Grid.Column="1">
<TextBox Text="{Binding Path=FilePathOrServerName,UpdateSourceTrigger=PropertyChanged}"/>
</Border>
<Border Grid.Row="2" Grid.Column="0">
<Label HorizontalContentAlignment="Right">Название базы данных</Label>
</Border>
<Border Grid.Row="2" Grid.Column="1">
<TextBox IsEnabled="{Binding Path=DbNameEnable}" Text="{Binding Path=DbName,UpdateSourceTrigger=PropertyChanged}"></TextBox>
</Border>
<Border Grid.Row="3">
<Label HorizontalContentAlignment="Right">Название таблицы</Label>
</Border>
<Border Grid.Row="3" Grid.Column="1">
<ComboBox DockPanel.Dock="Left" MinWidth="350" ItemsSource="{Binding Path=TableDescriptions}" SelectedValue="{Binding Path=SelectedTableDescription}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock>
<Run Text="{Binding Schema}" />
<Run Text="." />
<Run Text="{Binding TableName}" />
</TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Border>
<Border Grid.Row="3" Grid.Column="2">
<Button DockPanel.Dock="Right" Command="{Binding Path=RefreshTablesCommand}" >
<Image Style="{StaticResource ImageIcon}" Source="../Icons/Refresh.png"/>
<Button.ToolTip>
Обновить
</Button.ToolTip>
</Button>
</Border>
<Border Grid.Row="4">
<Label HorizontalContentAlignment="Right">Ключ таблицы (целое число)</Label>
</Border>
<Border Grid.Row="4" Grid.Column="1">
<ComboBox ItemsSource="{Binding Path=ColumnDescriptions}" DisplayMemberPath="ColumnName" SelectedValue="{Binding Path=SelectedKeyColumnDescription}"></ComboBox>
</Border>
<Border Grid.Row="5">
<Label HorizontalContentAlignment="Right">Название поля для нормализованного значения</Label>
</Border>
<Border Grid.Row="5" Grid.Column="1">
<ComboBox ItemsSource="{Binding Path=ColumnDescriptions}" DisplayMemberPath="ColumnName" SelectedValue="{Binding Path=SelectedFullTextColumnDescription}"></ComboBox>
</Border>
</Grid>
<Border Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" >
<GroupBox DataContext="{Binding AlgorithmConfigVM}">
<GroupBox.Header>
Настройка алгоритма
</GroupBox.Header>
<Border>
<StackPanel>
<ComboBox ItemsSource="{Binding NormalizeServices}" SelectedItem="{Binding SelectedNormalizeService}" DisplayMemberPath="NormalizeAlgorithmType.Name"/>
<Border>
<StackPanel >
<Label>Параметры алгоритма</Label>
<ListView MinHeight="100" ItemsSource="{Binding Params}">
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Label Grid.Column="0" Content="{Binding Item.Name}"></Label>
<TextBox Grid.Column="1" Text="{Binding Value}"></TextBox>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</Border>
<Border>
<StackPanel>
<Label>Настройка привязок результатов раскладки</Label>
<ListView Height="100" ItemsSource="{Binding FieldBindings}" SelectedItem="{Binding SelectedBinding}" ScrollViewer.VerticalScrollBarVisibility="Visible" HorizontalContentAlignment="Stretch">
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Label Grid.Column="0" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch">
<TextBox IsReadOnly="True" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" BorderThickness="0" Focusable="False" Cursor="Arrow" >
<TextBox.Text>
<MultiBinding StringFormat="{}{0} ({1})" Mode="OneWay">
<Binding Path="Item.Name" />
<Binding Path="Item.Description" />
</MultiBinding>
</TextBox.Text>
</TextBox>
</Label>
<ComboBox Grid.Column="1" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=StackPanel},
Path=DataContext.AvailableColumns}" DisplayMemberPath="ColumnName"
SelectedItem="{Binding Value}">
</ComboBox>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</Border>
</StackPanel>
</Border>
</GroupBox>
</Border>
<WrapPanel Grid.Row="2" Grid.ColumnSpan="3" HorizontalAlignment="Center" Margin="0 30 0 0">
<Button Command="{Binding Path=SaveCommand}" Margin="0 0 25 0">
<Button.Content>
<StackPanel Orientation="Horizontal">
<Image Style="{StaticResource ImageIconWithMargin}" Source="../Icons/Save.png"/>
<Label VerticalAlignment="Center">Сохранить</Label>
</StackPanel>
</Button.Content>
</Button>
<Button Command="{Binding Path=CancelCommand}" Margin="0 0 25 0">
<Button.Content>
<StackPanel Orientation="Horizontal">
<Image Style="{StaticResource ImageIconWithMargin}" Source="../Icons/Cancel.png"/>
<Label VerticalAlignment="Center">Отменить</Label>
</StackPanel>
</Button.Content>
</Button>
</WrapPanel>
</Grid>
</Window>
一般来说,我想让一行有 2 列:TextBox
和CheckBox
我做了这样的一切:
<ListView Grid.Row="5" Grid.Column="1" MinHeight="100" ItemsSource="{Binding SelectedColumns}" ScrollViewer.VerticalScrollBarVisibility="Visible" >
<ListView.ItemTemplate>
<DataTemplate>
<DockPanel >
<TextBox DockPanel.Dock="Left" IsReadOnly="True" IsReadOnlyCaretVisible="False" Width="200" Text="{Binding Item.ColumnName}"></TextBox>
<CheckBox DockPanel.Dock="Right" Width="20" IsChecked="{Binding Checked}"></CheckBox>
</DockPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
这不是很漂亮,我想将 90% 分配给第一个元素,其余的分配给 CheckBox。
我该怎么做?看起来宽度和高度的显式设置并不完全正确,因为一切都应该自己安排。
我试过UniformGrid
了,但它均匀地拉伸了所有东西,我不想要......
假设我有一个类,其中包含描述配置的 2 个对象:
每个类都有自己的字段等。
是的,我可以将所有这些都塞到一个 VM 中,但恕我直言,它会很大,我想将它分成 2 个 VM,但是这样配置就在一个窗口内。
如何解决这个问题?WPF 中是否有支持不同上下文的控件?
告诉我是否有 C# 中的常规工具,以便我可以传递一些 XPath 并复制带有属性、值的整个层次结构,仅此而已。
假设我通过了这个 XPath:root/TableRow/Id
而且即使root中除了TableRow还有其他节点,他也不会拿走。
或者您是否需要手动处理所有内容,从最后一个元素开始并按节点构建副本?
假设我想做一个通用的 IsNullOrEmpty 方法,它可以将类型 T 作为输入。
检查 Nullable 类型以查看它是否具有值时出现问题。
也就是我发现前端是Nullable的,但是
if (T is Nullable<T> nullable)
不起作用,并发誓不可能这样做......
我怎样才能做到这一点并确保 HasValue 返回真或假?
告诉我,在 C# 中是否有一种标准方法可以使用 XPath 创建整个节点分支?
假设我提供 XPath root/node1/node2/node3 作为输入,整个分支将在 XDocument 中为我创建。
还是只能用句柄一个一个地迭代地创建 XElement?
一般来说,我试图通过 SMTP 客户端将内部工作邮件中的一封信发送到位于 rambler 的邮箱。我将带有西里尔文名称的 *.xlsx 文件附加到此附件中。
问题是在信件的附件中它显示为 2.bin,尽管它可以正确地发送给其他邮件。该文件在发送时没有损坏,因为如果重命名它,它可以通过 Excel 正确打开。
如果你把名字改成拉丁文,那么问题就消失了……但是,我不明白这个名字的转换与什么有关……如果编码有问题,那么名字会显示为一些有点胡言乱语。
也许有人遇到过类似的问题?
我通过 C# 代码发送一封信,我使用 MailKit,
一般来说,由于某种原因,当作为独立的 Win x64 应用程序运行 Publish 时,错误 Sql client is not supported on this platform 崩溃,但如果您在 VS 下运行它,则一切正常。
.Net Core 是 2.2 版本,带有最新的可用 lib 版本,可与 Sql Server 一起使用。
可能是什么问题呢?
起初,我犯了一个错误,我试图在 Startup.cs 中执行迁移,但在将其删除后,它在尝试减去数据时开始出现同样的错误。
一般来说,有2个实体:
public class Project
{
public int Id { get; set; }
public string ProjectName { get; set; }
public string ZnName { get; set; }
public virtual ICollection<Task> Tasks { get; set; }
}
public class Task
{
public int Id { get; set; }
public int ProjectId { get; set; }
public string Name { get; set; }
public double? TimePlan { get; set; }
public int? ItemsPlan { get; set; }
public float? ImagesPlan { get; set; }
public virtual Project Project { get; set; }
}
在配置文件中,我设置了它们之间的关系:
builder.HasMany(x => x.Tasks)
.WithOne(x => x.Project)
.HasForeignKey(x => x.ProjectId);
builder
.HasOne(t => t.Project)
.WithMany(p => p.Tasks)
.HasForeignKey(t => t.ProjectId);
我知道设置在一个方向就足够了,然后出于绝望我将它们复制到另一个实体的设置中,因为我认为这会解决问题......
EF Core 最新版本 2。
我在我的存储库中做了这样的事情:
var result = await context.Projects.Include(p => p.Tasks)
.AsNoTracking().ToArrayAsync(cancellationToken);
一些项目留下了一个空的任务集合。
如果您尝试采用一个特定的有问题的项目并将其包含在两个方向:
var project = context.Projects.Where(t => t.Id == 3220).Include(x => x.Tasks).ToList();
var tasks = context.Tasks.Where(t => t.ProjectId == 3220).Include(x=>x.Project).ToList();
一切正常...
这是什么废话?
一般来说,我有一个类型,它里面有一个带有这种类型的字段:
/// <summary>
/// Период отчёта
/// </summary>
public class MReportsReportPeriodType : EnumBase
{
/// <summary>
/// Ежедневный
/// </summary>
public static MReportsReportPeriodType Daily { get; } = new MReportsReportPeriodType(0, nameof(Daily), "Ежедневный");
/// <summary>
/// Еженедельный
/// </summary>
public static MReportsReportPeriodType Weekly { get; } = new MReportsReportPeriodType(1, nameof(Weekly), "Еженедельный");
private MReportsReportPeriodType(int id, string name, string description) : base(id, name, description)
{
}
}
在数据库中,这个东西被存储为一个 int 而不是一个单独的实体。
问题:有什么方法可以在 EF 2.0 中设置映射,使其在两个方向上都能正常工作?
理论上,我可以这样映射它:
var own=builder.OwnsOne(x => x.ReportType);
own.Ignore(x => x.Name);
own.Ignore(x => x.Description);
own.Property(x => x.Id).HasColumnName("ReportType");
这将适用于插入和更新,但是在从数据库中读取数据时会崩溃......我如何告诉 EF 从数据库中获取一个 INT,然后调用 special。获取 MReportsReportPeriodType 对象的类方法?
通常,有一个 liba,其中描述了模型、映射和上下文。
我执行命令:
添加迁移初始创建
工作室给我发了 nafig,说文件必须是可执行的。
好的,我将程序集连接到控制台应用程序并再次执行此命令,但我再次发送...
No DbContext was found in assembly 'ConsoleApp3'. Ensure that you're using the correct assembly and that the type is neither abstract nor generic.
虽然程序集中有 2 个 DbContext。
告诉我,在我的情况下创建迁移的正确算法是什么?
一般来说,我想添加 NTLM 身份验证。
在这里我读到 Kestrel 最近支持了这个功能,你只需要安装这个包:
Microsoft.AspNetCore.Authentication.Negotiate
我安装了所有东西并按照它说的做了:
services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
.AddNegotiate();
和 app.UseAuthentication();
我在 Windows 上启动我的 API 应用程序并从同一台 PC 上敲击 Google Chrome 控制器。
我收到一条消息,我必须输入凭据。我输入了我的 PC 所在域的凭据,但没有任何反应,他们再次询问我。
我错过了什么?
我有一个复合类型,我通过调用 OwnsOne 通过 Fluent API 进行配置。
因此,将根据模板 {Property name}_{Field name} 在数据库中创建字段。
有什么办法可以覆盖这种行为?
这是一个 metanit 的例子:
using Microsoft.EntityFrameworkCore;
namespace HelloApp
{
public class User
{
public int Id { get; set; }
public string Login { get; set; }
public string Password { get; set; }
public UserProfile Profile { get; set; }
}
public class UserProfile
{
public string Name { get; set; }
public int Age { get; set; }
}
public class ApplicationContext : DbContext
{
public DbSet<User> Users { get; set; }
public ApplicationContext()
{
Database.EnsureDeleted();
Database.EnsureCreated();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=relationsdb;Trusted_Connection=True;");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().OwnsOne(u => u.Profile);
}
}
}
假设有一个包含 A 列和 B 列的表。每列都有自己的索引。
因此,如果选择条件是 A 和 B,那么 SQL Server 将使用最优索引,但不会使用第二个,或者仍然会同时使用两个,例如,通过一个索引选择第一个,然后使用评选结果的第二个指标?
我倾向于只选择一个索引,但我无法谷歌确认......
该原理描述了 3 条规则:
不能在子类中强制执行前提条件。换句话说,子类不应该创建比基类中定义的更多的前提条件来执行某些行为。
后置条件不能在子类中放宽。也就是说,子类必须满足基类中定义的所有后置条件。
不变量——基类的所有条件——也必须存储在子类中
似乎一切都是合乎逻辑的,但我不明白在这种情况下,可以用继承做什么,以免违反这个原则......
例如,这里是 metanit 的一个例子:强化前置条件:
class Account
{
public int Capital { get; protected set; }
public virtual void SetCapital(int money)
{
if (money < 0)
throw new Exception("Нельзя положить на счет меньше 0");
this.Capital = money;
}
}
class MicroAccount : Account
{
public override void SetCapital(int money)
{
if (money < 0)
throw new Exception("Нельзя положить на счет меньше 0");
if (money > 100)
throw new Exception("Нельзя положить на счет больше 100");
this.Capital = money;
}
}
放宽后置条件:
class Account
{
public virtual decimal GetInterest(decimal sum, int month, int rate)
{
// предусловие
if (sum < 0 || month >12 || month <1 || rate <0)
throw new Exception("Некорректные данные");
decimal result = sum;
for (int i = 0; i < month; i++)
result += result * rate / 100;
// постусловие
if (sum >= 1000)
result += 100; // добавляем бонус
return result;
}
}
class MicroAccount : Account
{
public override decimal GetInterest(decimal sum, int month, int rate)
{
if (sum < 0 || month > 12 || month < 1 || rate < 0)
throw new Exception("Некорректные данные");
decimal result = sum;
for (int i = 0; i < month; i++)
result += result * rate /100;
return result;
}
}
我有些不明白,但是如果我真的需要改变遗留行为中的一些行为怎么办?
或者有一个接口并且 10 个类实现了这个接口 => 他们可以实现不同的行为,因为没有初始实现。