我正在使用实体框架4.3.1对SQL Server 2012数据库,我正在使用POCO方法.我收到以下错误,我想知道是否有人可以解释如何解决它:
ModelValidationException
在模型生成期间检测到一个或多个验证错误:\ tSystem.Data.Entity.Edm.EdmAssociationConstraint ::关系约束中的从属角色和主要角色中的属性数必须相同.
没有InnerException任何进一步的信息.
我无法更改数据库架构,这有点奇怪,但这里是......
以下是表格(如果它有助于我发布SQL以生成它们,但我不认为这些表实际上是问题,因为例外是在模型的验证中):
One
-
**OneId int not null
**TwoId int not null (FK)
**ThreeId int not null (FK)
Name nvarchar(50) not null
Two
-
**TwoId int not null
**ThreeId int not null (FK)
Name nvarchar(50) not null
Three
-
**ThreeId not null
Name nvarchar(50) not null
Run Code Online (Sandbox Code Playgroud)
这是实体(注意我在模型中包含外键但不是那个非常标准的):
public class Three
{
public int ThreeId { get; set; }
public string Name { get; set; }
public virtual ICollection<Two> …Run Code Online (Sandbox Code Playgroud) 首先,我试图在c#(.net 4)中做所有这些灾难,所以如果你拿出一些代码来帮助我,那将是值得赞赏的,但实际上任何事情都会有所帮助.
我有一种情况,我有一个设备只能获得GSM Cell信息(顺便通过AT+KCELL命令)所以我有一组关于蜂窝塔的值(每个都有LAC,MCC,MNC,Cell ID,信号强度和第一个时间预先).因此,我认为,我处在一个能够提出某种经度和纬度坐标的好地方(尽管不准确,但是,好吧).这是我寻求帮助的地方,因为现在我的小脑子很困惑......
我可以看到提供单元代码解析的各种服务(Google,Open Cell ID等),他们将LAC,MCC等作为参数并返回一个坐标.因此,我认为他们返回的将是我传入的特定塔的坐标.所以在我的情况下,我可以发送我拥有的所有LAC等,并获得经度和纬度的集合.很棒,但这不是我的设备所在.现在我觉得我需要做一些三角测量,而这正是我缺乏知识伤害了我的地方.
那么到目前为止我是对的吗?假设我是,我该怎么做这个计算(有什么东西可以告诉我如何处理所有这些数字,或者更好的是,一些开源库我可以参考并提供所有这些东西以获得明智的东西) ?
我假设我需要使用定时提前计算出距离手机信号塔一些近似距离(可能以某种方式使用信号强度),但我该怎么做?正如你所知道的那样 - 我在这里超出了我的深度!
例如,我可以从前面提到的AT命令中找到这个:
5,74,33,32f210,157e,8101,50,0,79,3,32f210,157e,80f7,37,64,5,32f210,157e,810b,37,55,32,32f210,157e,9d3,27,41,33,32f210,157e,edf8,15
Run Code Online (Sandbox Code Playgroud)
打破它并解析它我会得到(我希望我解析正确 - 当然我的解析例程中有一个错误,但它看起来很合理):
Number of cells: 5
Run Code Online (Sandbox Code Playgroud)
细胞1
LAC: 5502
MNC: 1
MCC: 232
Cell ID: 33025
Signal: 80
ARFCN: 74
BSIC: 33
Timing advance: 0
Longitude: 14.2565389
Latitude: 48.2248439
Run Code Online (Sandbox Code Playgroud)
细胞2
LAC: 5502
MNC: 1
MCC: 232
Cell ID: 33015
Signal: 55
ARFCN: 79
BSIC: 3
Longitude: 14.2637736
Latitude: 48.2331576
Run Code Online (Sandbox Code Playgroud)
细胞3
LAC: 5502
MNC: 1
MCC: 232
Cell ID: 33035
Signal: 55
ARFCN: …Run Code Online (Sandbox Code Playgroud) 所以我稍微看了一下MethodImplAttribute,我遇到了MethodImplOptions.AggressiveInlining,它被描述为:
如果可能,应该内联该方法.
Oooooh,我心里想,这听起来很有趣 - 我可以假装我比编译器更聪明,强制代码只使用我的邪恶意志的力量和几个方括号,ha,ha,ha ...
因此,我启动了Visual Studio 2013,创建了一个控制台应用程序,将.NET版本设置为4.5.1并编写程序以结束所有程序(Release当然,在模式下编译它):
using System;
using System.Runtime.CompilerServices;
namespace ConsoleApplication1
{
public static class SoHelpful
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int GetSomeValueProbablyTwelve()
{
return 12;
}
[MethodImpl(MethodImplOptions.NoInlining)]
public static int GetSomeValueLikelyThirteen()
{
return 13;
}
public static int GetSomeValueMaybeItIsTwentyEight()
{
return 29;
}
}
class Program
{
static void Main()
{
int twelve = SoHelpful.GetSomeValueProbablyTwelve();
int thirteen = SoHelpful.GetSomeValueLikelyThirteen();
int twentyNine = SoHelpful.GetSomeValueMaybeItIsTwentyEight();
Console.WriteLine((twelve + thirteen + twentyNine));
}
} …Run Code Online (Sandbox Code Playgroud) 我解释给同事,你应该使用===和!==(和>==和<==当然的),在JavaScript中比较变量时,所以它不会强制参数,并得到所有froopy和混乱,但他们问了我一个问题的两个部分,我不知道答案并认为我会问专家,特别是:
怎么样
>和<-当他们做比较,他们也强迫的论据与否-为什么没有某种形式的>>和<<运营商(可能需要一些其他的语法,我猜他们会如果沿着去进行位移位运算符整个C风格,但你得到的要点)?
所以我可以写一个测试来找到第一部分的答案,我做了,这里是:
// Demo the difference between == and ===
alert(5 == "5");
alert(5 === "5");
// Check out what happens with >
alert(5 > "4");
alert(5 > 4);
Run Code Online (Sandbox Code Playgroud)
它返回了:
true
false
true
true
Run Code Online (Sandbox Code Playgroud)
所以它看起来像是在>做强制,因为> "4"并> 4返回相同的结果.那么第二部分怎么样......
是否存在某种类型的操作符>并且<不强制该类型(或者如何更改我的测试以安全地执行测试)?
我正在研究一个非常简单的方法生成的IL,因为我想做一些自我反射,我遇到了这个问题的评论中提到的东西(但不是问题):使用Br_S OpCode指向使用Reflection.Emit.Label的下一条指令,没有人回答它,我想知道它.所以...
如果我有这样的方法:
public string Test()
{
return "hello";
}
Run Code Online (Sandbox Code Playgroud)
然后我运行ILDASM我看到IL是这样的:
.method public hidebysig instance string
Test() cil managed
{
// Code size 11 (0xb)
.maxstack 1
.locals init ([0] string CS$1$0000)
IL_0000: nop
IL_0001: ldstr "hello"
IL_0006: stloc.0
IL_0007: br.s IL_0009
IL_0009: ldloc.0
IL_000a: ret
}
Run Code Online (Sandbox Code Playgroud)
我觉得好奇的部分是:
IL_0007: br.s IL_0009
IL_0009: ldloc.0
Run Code Online (Sandbox Code Playgroud)
第一行是对第二行进行无条件转移.这次手术的原因是什么,它什么都不做?
看来我的问题很严厉,因为我想知道的事情有些混乱.最后一句应该是这样的:
当编译器似乎没有任何目的时输出这个无条件转移语句的原因是什么?
关于断点的建议让我想到尝试在发布模式下编译它,确定我感兴趣的部分消失了,而IL就变成了这个(这就是为什么我跳起来认为断点回答是原因):
.method public hidebysig instance string
Test() cil managed
{
// Code size 6 (0x6)
.maxstack 8
IL_0000: …Run Code Online (Sandbox Code Playgroud) 说我有这么一点代码:
public static void LoadSomething(Type t)
{
var t1 = Type.GetType(t.AssemblyQualifiedName);
var t2 = t
.Assembly
.GetTypes()
.First(ta => ta.AssemblyQualifiedName == t.AssemblyQualifiedName);
}
Run Code Online (Sandbox Code Playgroud)
会发生什么是t1为空且t2 不为空.我很困惑,因为如果我这么称呼它......
LoadSomething(typeof(SomeObject));
Run Code Online (Sandbox Code Playgroud)
然后它们都不是null但我实际上做的更像是这样(不是真的,这是大规模简化但它说明了我的观点):
LoadSomething(Assembly.LoadFile(@"C:\....dll").GetTypes().First());
Run Code Online (Sandbox Code Playgroud)
所以问题的第一部分(供我参考)是......
在第二种情况下,由于必须加载程序集并且我找到了它的类型,为什么Type.GetType返回null?
其次(实际解决我的问题)......
当我只将汇编限定名称作为字符串(我之前已经使用Assembly.Load方法加载)时,是否还有其他方法可以加载类型?
我在ac#class library project(.net 4)上使用Visual Studio 2010 SP1 Ultimate,我很好奇......
鉴于此方法:
public void DoSomethingBrilliant(int input)
{
if (input == int.MaxValue)
throw new ArgumentOutOfRangeException("input");
input++;
Console.WriteLine(input);
}
Run Code Online (Sandbox Code Playgroud)
我从代码分析中收到此警告:
CA2233:Microsoft.Usage:更正'Test.DoSomethingBrilliant(int)'中操作'input + 1'的潜在溢出.
我心里想,这有点奇怪,因为我检查input++操作不会因为在开始时抛出那个时髦的异常而溢出,但我把它更改为:
public void DoSomethingBrilliant(int input)
{
if (input >= int.MaxValue)
throw new ArgumentOutOfRangeException("input");
input++;
Console.WriteLine(input);
}
Run Code Online (Sandbox Code Playgroud)
果然警告消失了.
现在我的小脑子都搞糊涂了,因为我得到一个int作为参数,为什么要检查它是否大于允许整数提供任何值的最大值?
然后我回到原来的代码并切换到调试,并在没有警告的情况下构建它!Curiouser和curioser ......
我检查了调试和发布之间的差异,发现如果我勾选Optimize代码选项,代码分析的警告会立即弹回.
因此,优化会导致我需要检查大于int.MaxValue的内容.咦?为什么?我超级密集吗?优化完成了什么意味着我可能得到一个大于int.MaxValue的int 传递给接受int的方法?
或者,这只是代码分析功能中的一个错误吗?
更新
这是"未经优化"版本的IL(代码分析正确):
.method public hidebysig instance void DoSomethingBrilliant(int32 input) cil managed
{
// Code size 40 …Run Code Online (Sandbox Code Playgroud) 我已经编写了一个.net 4.0控制台应用程序,它定期与GSM调制解调器通信,以获取收到的SMS消息列表(它是一个USB调制解调器,但代码通过串口驱动程序连接到它并发送AT命令 - 顺便说一句,它是Sierra无线调制解调器,但我不能改变它,我有最新的驱动程序).会发生什么事情,经过一段时间(可能是几小时,也许几天),它就会停止工作.这是一个日志片段......
2012-04-17 23:07:31 DEBUG Modem Check (108) - Executing AT command 'AT+CPMS="ME"'...
2012-04-17 23:07:31 DEBUG Modem Check (108) - Finished executing 'AT+CPMS="ME"'
2012-04-17 23:07:31 DEBUG Modem Check (108) - Detaching event handlers for 'COM13'
2012-04-17 23:07:31 DEBUG Modem Check (108) - Disposing the SerialPort for 'COM13'
Run Code Online (Sandbox Code Playgroud)
这就是日志的结束 - 即使我希望看到至少还有一个语句,这就是相关的代码:
internal T Execute()
{
var modemPort = new SerialPort();
T ret;
try
{
modemPort.ErrorReceived += ModemPortErrorReceived;
modemPort.PortName = _descriptor.PortName;
modemPort.Handshake = Handshake.None;
modemPort.DataBits = 8;
modemPort.StopBits = StopBits.One; …Run Code Online (Sandbox Code Playgroud) 我很开心玩Rust很长一段时间都是C#程序员,但我对反思有疑问.
嗯,我认为反思,也许我不需要在这种情况下进行反思,但鉴于Rust是强烈打字我怀疑我做的(我肯定需要它在好的'C#,祝福它的棉袜).
是的,所以说我有这种情况:
use std::collections::HashMap;
fn invoke_an_unknown_function(
hashmap: HashMap<String, String>,
// Something to denote a function I know nothing about goes here
) {
// For each key in the hash map, assign the value
// to the parameter argument whose name is the key
// and then invoke the function
}
Run Code Online (Sandbox Code Playgroud)
我该怎么办?我猜我需要传递一些MethodInfo作为函数的第二个参数,然后用它来解决它的名字是哈希映射中的键的参数并分配值,但我看了一下反射API并发现以下内容:
但他们都没有给我足够的继续开始.那么,我将如何实现上面描述的功能呢?
.net ×6
c# ×6
at-command ×1
deadlock ×1
geolocation ×1
gsm ×1
javascript ×1
poco ×1
reflection ×1
rust ×1
serial-port ×1