实体框架在批量插入/更新/删除操作上可能非常慢.即使是经常建议的关闭AutoDetectChanges和/或ValidateOnSaveEnabled的调整也并不总是有帮助.
我在NuGet上遇到过Z.EntityFramework.Extensions,但它似乎是一个商业产品,只能运行一段时间.
https://www.nuget.org/packages/Z.EntityFramework.Extensions/
到目前为止,我真的只需要BulkInsert(),BulkUpdate()和BulkDelete().
我的问题是:
有没有可靠的非商业库,它与Z.EntityFramework.Extensions几乎相同?
谢谢你的任何提示!
我在WPF中有一个自定义控件.我添加了两个普通的CLR属性,如下所示:
private int _ChordFrom = 0;
public int ChordFrom
{
get { return _ChordFrom; }
set { _ChordFrom = value; }
}
private int _ChordTo = 0;
public int ChordTo
{
get { return _ChordTo; }
set { _ChordTo = value; }
}
Run Code Online (Sandbox Code Playgroud)
我使用普通的CLR属性,因为我不想将这些属性绑定到任何其他依赖项.我只是想在实例化控件时在XAML中设置值.
在XAML中,属性是由intellisense找到的,但在构建项目时我得到错误:
"会员"ChordFrom"无法识别或无法访问." "会员"ChordTo"无法识别或无法访问."
XAML代码如下所示:
<TabItem Header="CHORDS I">
<Grid x:Name="_gridChords_1" Background="AliceBlue">
<mg:MidiChordGrid x:Name="gridMidiChordGrid_1" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ChordFrom="0" ChordTo="7"/>
</Grid>
</TabItem>
Run Code Online (Sandbox Code Playgroud)
有三件事,我想知道:
为什么Intellisense会向我提供XAML中的属性,如果它们不可访问?
如果我关闭所有XAML窗口,重建项目,错误就会消失.
即使可以在没有任何错误的情况下构建项目,也不会设置属性.
答案| 答案| 答案| 答案| 答案| 答案| 回答
感谢所有答案,但解决方案/错误在我的代码中.设置这两个CLR属性后,我忘了更新我的网格.非常遗憾.
但这里有一些你可能想知道的事实:
我正在开发一个silverlight应用程序,我的所有图标都是PNG.
所有这些图标的颜色都是黑色,或者更确切地说是黑色到灰色,具体取决于alpha值.每个PNG都有透明的背景.
在我的应用程序中,我想做一个逐像素颜色从黑色或灰色变化,让我们说红色(黑色之前)或浅红色(灰色之前).
我认识到,遍历每个像素的字节,每个全黑像素的alpha值为255.灰色的那些像素值在1到254之间.α值为0似乎是透明的.黑色的RGB值均为0.
我的想法是,我改变了每个像素的颜色,但保留了alpha值,以便PNG保持原始的外观.
为此,我写了一个小函数,看起来像这样:
private static WriteableBitmap ColorChange(WriteableBitmap wbmi, System.Windows.Media.Color color)
{
for (int pixel = 0; pixel < wbmi.Pixels.Length; pixel++)
{
if (wbmi.Pixels[pixel] != 0)
{
byte[] colorArray = BitConverter.GetBytes(wbmi.Pixels[pixel]);
byte blue = colorArray[0];
byte green = colorArray[1];
byte red = colorArray[2];
byte alpha = colorArray[3];
if (alpha > 0)
{
//HERE, I change the color, but keep the alpha
//
wbmi.Pixels[pixel] = Gui.Colors.ToInt.Get(color,alpha);
colorArray = BitConverter.GetBytes(wbmi.Pixels[pixel]);
blue = colorArray[0];
green = colorArray[1];
red = colorArray[2]; …Run Code Online (Sandbox Code Playgroud) 我知道你的想法:2017年,请不要再提出这个,但我真的找不到任何有价值的解释.
请查看此XAML代码中的ActiveNotes属性.
我在我的XAML中有这个TwoWay绑定,它完美地运行.如果触发了ScaleNotes的PropertyChanged事件并且绑定设置为TwoWay,则它始终更新.
<c:Keyboard
Grid.Row="2"
Grid.Column="0"
PlayCommand="{Binding PlayCommand}"
StopCommand="{Binding StopCommand}"
ActiveNotes="{Binding ScaleNotes, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
Run Code Online (Sandbox Code Playgroud)
ViewModel中的ScaleNotes属性如下所示.每当它发生变化时,都会保证触发PropertyChanged事件.我检查并仔细检查了一下.ViewModel中的业务逻辑有效.
private ReadOnlyCollection<eNote> _ScaleNotes;
public ReadOnlyCollection<eNote> ScaleNotes
{
get { return _ScaleNotes; }
set { SetField(ref _ScaleNotes, value); }
}
[DebuggerStepThrough]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
[DebuggerStepThrough]
protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
Run Code Online (Sandbox Code Playgroud)
到这里一切都很好.每当更改VM中的ScaleNotes属性时,都会更新目标属性ActiveNotes.
现在的问题是: …
情况
我有许多参数化的SQL命令。我在一个循环中一个接一个地执行这些命令,如下所示:
public void SaveChanges()
{
using (var ts = _Context.Database.BeginTransaction())
{
try
{
_Context.SaveChanges();
foreach (var cmd in _Commands)
{
if (cmd.Parameter != null)
{
_Context.Database.ExecuteSqlCommand(cmd.Sql, cmd.Parameter.ToArray());
}
}
ts.Commit();
}
catch (Exception ex)
{
ts.Rollback();
throw new Exception("SaveChanges");
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码可以正常工作,事务回滚也可以正常工作。
我的命令类如下所示:
public class SqlBuilderCommand
{
public string Sql { get; set; }
public List<SqlParameter> Parameter {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
没有具体解决方案的可能重复
我已经找到了这个问题的几个可能的重复。最接近的是:
不幸的是,它对我使用实体框架没有帮助(或者我只是不明白)
问题
是否可以一次往返执行列表中的所有命令?
如果不是,是否可以使用ADO.NET?
解决方案和缺点/局限性
感谢@Evgeni的正确答案。是的,您可以连接许多SQL字符串,并且只需一次往返就可以将参数作为列表发送。那很棒。
但是SQL-Server有一个限制。SQL-Server仅通过一个命令最多接受2100个参数。因此,如果您的对象具有7个数据库列,则每个命令的最大批量插入量为300个对象。否则,您将获得例外。
如果我对5000个对象执行此操作,则会导致17个大容量插入(5000/300)。我停止了5000个对象的时间,但仍然是8到9秒,这太慢了,因为我知道原始SQL会更快得多。
在这一点上,我认为对我而言,没有办法解决原始SQL,除非有人告诉我,有一种方法可以加快sql命令的速度。
也许我会为此写一个后续问题。该死的。
我正在研究 Blazor Web assembly 组件的布局。(=胖浏览器客户端,无服务器渲染)
布局如下所示并按预期工作:
.grid
{
min-height: 100vh;
min-width: 100vw;
height: 100vh;
width: 100vw;
background-color: black;
display: grid;
grid-template-rows: 10px 5vh calc(90vh - 20px) 5vh 10px;
grid-template-columns: 10px 3vw calc(94vw - 20px) 3vw 10px;
/*Blazor Special*/
margin: -8px;
}
Run Code Online (Sandbox Code Playgroud)
.gridCellLogo
{
grid-column-start: 2;
grid-column-end: 2;
grid-row-start: 2;
grid-row-end: 2;
background-color: red;
}
Run Code Online (Sandbox Code Playgroud)
<div class="grid">
<div class="gridCellLogo">
@*Put your component here*@
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用 CSS 变量,它们不会被应用。看看 --somecolor
:host
{
--somecolor: green;
}
.grid {
min-height: …Run Code Online (Sandbox Code Playgroud) c# ×5
wpf ×2
xaml ×2
alpha ×1
binding ×1
blazor ×1
clr ×1
colors ×1
command ×1
css ×1
host ×1
oneway ×1
pixel ×1
roundtrip ×1
sql-delete ×1
sql-insert ×1
sql-server ×1
sql-update ×1
variables ×1