我正在尝试使用SQLite实体框架.我将问题集成到我的主应用程序中时遇到了问题,因此我从头开始进行了一些测试,完全按照http://brice-lambson.blogspot.com/2012/10/entity-framework-on-sqlite.html上的说明进行操作.
毕竟说完了,运行项目时出现以下错误:
没有为ADO.NET提供程序找到具有不变名称"System.Data.SQLite"的实体框架提供程序.确保提供程序已在应用程序配置文件的"entityFramework"部分中注册.有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882.
我的app.config看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
</configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<add name="SQLite Data Provider"
invariant="System.Data.SQLite"
description="Data Provider for SQLite"
type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<add name="ChinookContext"
connectionString=
"Data Source=|DataDirectory|Chinook_Sqlite_AutoIncrementPKs.sqlite"
providerName="System.Data.SQLite" />
</connectionStrings>
</configuration>
Run Code Online (Sandbox Code Playgroud)
然后我看到他关于实体框架6的帖子.虽然这不是我得到的确切错误,但我尝试通过NuGet安装他更新的提供程序.错误消失了,但取而代之的是:
无法加载文件或程序集'System.Data.SQLite.Linq,Version = 2.0.88.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040) …
一段时间以来,我一直在寻找一种适用于URL的Path.Combine方法.这与URL的Path.Combine类似?有一个很大的区别.
我将以一个例子来说明.假设我们有一个基本网址:http://example.com/somefolder
和一个文件:foo.txt
.因此,完整的路径将是:http://example.com/somefolder/foo.txt
.听起来很简单吧?哈.
我尝试了Uri课:Uri.TryCreate(new Uri("http://example.com/somefolder"), "foo.txt", out x);
结果"http://example.com/foo.txt"
.
然后我尝试了Path:System.IO.Path.Combine("http://example.com/somefolder", "foo.txt");
结果"http://example.com/somefolder\foo.txt"
......更近,但仍然没有.
为了踢,我接着尝试了:System.IO.Path.Combine("http://example.com/somefolder/", "foo.txt")
结果"http://example.com/somefolder/foo.txt"
.
最后一个工作,但它基本上在那时进行字符串连接.
所以我认为我有两个选择:
我错过了一个内置的框架方法吗?
更新:我的用例是下载一堆文件.我的代码看起来像这样:
public void Download()
{
var folder = "http://example.com/somefolder";
var filenames = getFileNames(folder);
foreach (var name in filenames)
{
downloadFile(new Uri(folder + "/" + name));
}
}
Run Code Online (Sandbox Code Playgroud)
我不得不在Uri构造函数中使用字符串concat,并且还要检查是否需要斜杠(我在代码中省略了).
在我看来,我想要做的事情会出现很多,因为Uri类除了http之外还处理很多其他协议.
在进行一些性能测试时,我遇到了一些我似乎无法解释的情况.
我写了以下C代码:
void multi_arr(int32_t *x, int32_t *y, int32_t *res, int32_t len)
{
for (int32_t i = 0; i < len; ++i)
{
res[i] = x[i] * y[i];
}
}
Run Code Online (Sandbox Code Playgroud)
我使用gcc将它与测试驱动程序一起编译成单个二进制文件.我还使用gcc将它自己编译成一个共享对象,我通过p/invoke从C#调用它.目的是衡量从C#调用本机代码的性能开销.
在C和C#中,我创建等长的随机值输入数组,然后测量multi_arr
运行所需的时间.在C#和CI中,使用POSIX clock_gettime()调用进行计时.我已经在调用multi_arr之前和之后定位了定时调用,因此输入准备时间等不会影响结果.我运行100次迭代并报告平均时间和最小时间.
尽管C和C#正在执行完全相同的功能,但C#在大约50%的时间内提前出现,通常是大量的.例如,对于1,048,576的len,C#的最小值为768,400 ns,而C的最小值为1,344,105.C#的平均值为1,018,865,而C的1,852,880.我在这个图中添加了一些不同的数字(记住日志标度):
这些结果对我来说似乎非常错误,但工件在多个测试中是一致的.我检查了asm和IL来验证是否正确.比特是一样的.我不知道在这个程度上可能会影响性能.我已经把一个最小的例子再现了这里.
这些测试都是在Linux(KDE neon,基于Ubuntu Xenial)上使用dotnet-core 2.0.0和gcc 5.0.4运行的.
谁看过这个吗?
我正在使用Spring Cloud的Zuul将一些API请求代理到一些外部服务器.代理本身运行良好,但每个服务都需要请求头中提供的(不同)令牌.
我已成功为每个应用适当标头的令牌编写了一个简单的预过滤器.但是,我现在有一个问题.即使在完成文档后,我也无法弄清楚如何使每个过滤器仅适用于正确的路径.我不想在网址随环境变化时执行网址匹配.理想情况下,我有一些方法可以在过滤器中获取路径的名称.
我的application.yml:
zuul:
routes:
foo:
path: /foo/**
url: https://fooserver.com
bar:
path: /bar/**
url: https://barserver.com
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想在FooFilter.java(预过滤器)中执行类似的操作:
public bool shouldFilter() {
return RequestContext.getCurrentContext().getRouteName().equals("foo");
}
Run Code Online (Sandbox Code Playgroud)
但我似乎无法找到任何方法来做到这一点.
我正在开发一个开源的C#应用程序.一段时间以来,我一直在使用我自己编写的基本.NET安装程序.但是,随着最近的更改,这对我来说已不再适用,因为我必须向安装程序添加大量文件 - 并且它们可能随每个版本而变化.ZIP文件也不实用.
我已经在网上做了一些检查,我看到了很多MSI,ClickOnce,自解压ZIP,以及(最有希望的)NSIS系统.它们似乎都不符合我的需求,所以我正在寻找有关使用哪个系统的建议.
我的程序的实际安装非常简单.基本上,我只需要将bin\Release目录(和所有子目录)复制到客户端的计算机上.通过在.NET安装程序中嵌入每个文件,并维护一个文件表,我一直在实现这一点.
不幸的是,我只是本地化了我的应用 我现在有30多个.resx文件(由Visual Studio编译为dll并放入MORE子目录),显然,向我的安装程序添加30多个文件夹和DLL是不切实际的.因此,为什么我在这个搜索.
还有一些其他要求:
对不起,很长的帖子,我认为最好发布更多.
这是从这个线程产生的一个问题: Native C++ use C# dll via proxy C++ managed dll
简而言之,我正在通过 DLL 将(我的)C# 扩展加载到本机进程中。扩展程序需要显示一个表单,以便用户可以控制它。我正在使用标准的 .NET 表单,没有 3rd 方库或任何东西,我的表单没有显示。更糟糕的是,它会挂起目标进程。它没有使用任何 CPU,所以我觉得它在等待某个函数返回,但从来没有。
同样有趣的是弹出“初始化方法”消息框,而不是“测试”消息框。我已经测试了我能想到的所有东西(STAthread、线程、DisableThreadLibraryCalls,以及不同的代码位置),直到周日。我倾向于认为这是 Win32 互操作的一些模糊细节,但我找不到任何似乎会导致这些症状的东西。
你们中的一位专家可以看看我的代码并指出问题所在吗?
/// <summary>
/// Provides entry points for native code
/// </summary>
internal static class UnmanagedExports
{
[UnmanagedFunctionPointer(System.Runtime.InteropServices.CallingConvention.StdCall)]
public delegate int SendRecv([MarshalAs(UnmanagedType.SafeArray)]byte[] ByteArray, UInt64 Len);
[STAThread]
[DllExport("Initialize", CallingConvention.StdCall)]
public static int Initialize(IntPtr hInstance, SendRecv Send, SendRecv Recv)
{
return DLLinterface.Initialize(hInstance, Send, Recv);
}
[DllExport("Terminate", CallingConvention.StdCall)]
public static void Terminate()
{
DLLinterface.Terminate();
}
}
internal class DLLinterface
{ …
Run Code Online (Sandbox Code Playgroud) 我正在开发我的第一个实体框架应用程序.我正在使用EF vesion 6(来自Nuget)和.net 4.0.但是,对我来说,我遇到了一些困难,对我来说,它看起来应该非常简单.我在互联网上发现了许多相互矛盾的建议和解决方案,但在花了几天时间尝试解决问题之后,我真的很困惑,并且质疑我对实体框架的一些基本理解.我想要做的是:创建一个简单的相关实体集合,并在从父项中删除它们时自动删除它们.
以下是我在vanilla C#中对此进行建模的方法.与Microsoft示例一致,假设我们有两个类,Post和Tag,如下所示:
public class Post
{
public string Name { get; set; }
public string Author { get; set; }
public ICollection<Tag> Tags { get; set; }
}
public class Tag
{
public string Text { get; set; }
// Possibly other properties here
}
Run Code Online (Sandbox Code Playgroud)
然后,添加标签非常简单myPost.Tags.Add(myTag)
,删除标签就像这样简单myPost.Tags.Remove(myTag)
.
现在进入实体框架的一面:我看了一下,然后想到了"外键,当然!" 但是我添加了一个FK有很多问题:标签在从帖子中删除时不会从数据库中删除,从数据库myPost.Tags
加载时会有0个元素,尽管SQL资源管理器显示PostId值是正确的,等等我对一堆技巧感到困惑,比如标记Tag.PostId
为一个键,手动删除标签,实际上将标签作为DbSet添加到上下文中,手动设置myTag.Post = null;
(我尝试使用Lazy加载启用和禁用,为了它的价值 - 虽然如果可能,我想保持关闭)
现在(在很大程度上要归功于看似矛盾和过于复杂的例子),我很困惑和迷失.有人能告诉我我应该如何在EF中建立这种关系吗?(顺便说一下,我正在使用Code First)
感谢Moho,我想出了这个结构,它完全符合我的要求:
public class Post
{
public int Id { get; …
Run Code Online (Sandbox Code Playgroud) 我正在使用Code :: Blocks(C++)和MinGW在Windows上使用OpenGL制作游戏.所有的绘图和逻辑都很好,游戏运作完美.直到,突然之间,它没有.经过一段随机的时间,游戏Segfaults.与GL段错误一样,堆栈跟踪无益.我唯一得到的是segfault发生在供应商的OpenGL实现中.我已经在不同供应商的多张显卡上进行了测试,他们都是这样做的,所以问题出现在我的最后.
我通过gDEBugger运行程序并获得了相同的无用堆栈跟踪.大声笑.我也使用了GLIntercept,但没有任何东西跳出来.所以我开始以手动方式找到segfault(BuGLe拒绝编译......)并且基本上将跟踪消息写入日志.我把它缩小到一次调用glDrawArrays.我在互联网上做了很多工作,尝试了很多我发现的修复方法.
因为这个游戏不是为了便携而编码,所以我一直犹豫不决于在wine和valgrind中运行它.在我搞乱这个奇怪的混乱之前,如果你能查看我的代码并发现错误,我会很感激.(我确定这是显而易见的......)
(注意:为了便于阅读,我删除了所有的跟踪线)
void PlayerShip::Render()
{
glPushMatrix(); //Save the current state
glTranslatef(m_PosX, m_PosY, 0);
glRotatef(vect.Rotation - 90, 0, 0, 1); //Matrixes are applied in reverse order
double xl = m_SizeX / 2, yl = m_SizeY / 2; //Get values to add/subract to the midpoint for the corners
glEnable(GL_TEXTURE_2D); //Redundant
TextureManager::Inst()->BindTexture(TexIDs::Playership01); //Bind the texture
glEnableClientState(GL_VERTEX_ARRAY); //These enables and disables are redundant here
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
GLdouble* Verts;
Verts = new GLdouble[12] { -xl, -yl, -.5, xl, …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将可观察集合绑定到 WPF DataGrid。我的属性之一是布尔值。我不喜欢 DataGrid 的 CheckboxColumn,因此我使用 TemplateColumn 推出了自己的 CheckboxColumn,并将其绑定到 DataContext 上的公共属性。该项目设计、编译和运行良好。但是,在设计器中,Visual Studio 2013 Professional 用红色强调了绑定路径。当我将鼠标悬停在它上面时,它会显示“预期属性”。奇怪的是,这不会显示在错误列表中,但滚动条上确实有红色的“错误标记”。另外,如果我使用“标准”CheckboxColumn,VS 不会显示下划线。
这是我的 DataContext 类:
sealed class Connection : IDisposable
{
public bool Log { get; set; }
public int HashCode { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
这是 DataGrid 的 XAML:
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path=Connections}" SelectionMode="Single">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=HashCode, StringFormat={}{0:X}}" Header="ID" IsReadOnly="True" Width="50*"/>
<DataGridTemplateColumn Header="Log">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" IsChecked="{Binding Path=Log, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
这是错误的屏幕截图:
奇怪的是,VS 对于这个 XAML 没问题,但由于列的行为,我不想使用它: …
我正在用C++制作一个OpenGL游戏.与其他语言相比,我在C++方面相当无趣.无论如何,我为一些图像创建了一个带有"base"目录的字符串流.然后我将此stringstream作为函数参数传递给构造函数.构造函数附加图像文件名,然后尝试加载生成的路径.然而...
D:\CodeBlocks Projects\SnakeRoid\bin\Debug\Texts\ <-- before appending the filename
Ship01.tgacks Projects\SnakeRoid\bin\Debug\Texts\ <-- After.
Run Code Online (Sandbox Code Playgroud)
显然不正确!结果应为D:\ CodeBlocks Projects\SnakeRoid\bin\Debug\Texts\Ship01.tga
我的代码的相关部分:
std::stringstream concat;
std::string txtFullPath = "Path here";
...
concat.str(""); //Reset value (because it was changed in ...)
concat << texFullPath; //Restore the base path
PS = new PlayerShip(&TexMan, concat); //Call the constructor
Run Code Online (Sandbox Code Playgroud)
构造函数的代码
PlayerShip::PlayerShip(TextureManager * TexMan, std::stringstream &path)
{
texId = 2;
std::cout << path.str(); //First path above
path << "Ship01.tga";
std::cout << path.str(); //Second - this is the messed up one
//Do more …
Run Code Online (Sandbox Code Playgroud)