S'p*_*'Kr 9 .net c# database entity-framework
自从@
解决了我遇到的问题以来,此时纯粹是好奇心,但为什么Name
特别?
我有一个EF实体属性叫Name
...如果我不把它@
放在前面Name
,我没有得到任何类型的错误,但Name
对象的属性没有被分配.如果我放入@Name
对象初始化程序,它会Name
正确分配:
a = new Author
{
Id = Guid.NewGuid().ToString(),
@Name = "Jason Hater" // Apparently "Name" is quasi-reserved or something...?!?
};
Run Code Online (Sandbox Code Playgroud)
我检查了生成的代码,它只是命名为Name
:
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
[DataMemberAttribute()]
public global::System.String Name
{
get
{
return _Name;
}
//...
}
Run Code Online (Sandbox Code Playgroud)
所以,Name
没有列为关键字,为什么它特别?
好吧,正如@sergey建议的那样,它肯定比我想象的要复杂一点.特别是关于实体框架的蠢事.
这在单元测试类中表现出来,也可能是相关的.我不确定什么是相关的,什么不是现在不幸的,所以这是整个[TestInitialize]
方法,在它的底部你可以看到奇怪的事情发生在context.SaveChanges()
:
[TestClass]
public class EntityConverterTests
{
private Author a;
private Post p, p2, p3;
[TestInitialize]
public void SetupEntities()
{
TestEntities context = new TestEntities();
// Clear it out!
foreach (Comment o in context.Comments) context.Comments.DeleteObject(o);
foreach (Post o in context.Posts) context.Posts.DeleteObject(o);
foreach (Author o in context.Authors) context.Authors.DeleteObject(o);
context.SaveChanges();
a = new Author
{
Id = Guid.NewGuid().ToString(),
Name = "Jason Hater"
};
context.Authors.AddObject(a);
System.Diagnostics.Debug.WriteLine(a.Name); // "Jason Hater"…Yay!
// probably irrelevant from here until context.SaveChanges()…?
p = new Post()
{
Title = "Linkbait!",
Author = a
};
p2 = new Post
{
Title = "Rant #1023",
Author = a
};
p3 = new Post
{
Title = "Polemic in E-flat minor #824",
Author = a
};
a.Posts.Add(p);
a.Posts.Add(p2);
a.Posts.Add(p3);
p.Comments.Add(
new Comment()
{
Body = "Nuh uh!",
Post = p
}
);
p.Comments.Add(
new Comment()
{
Body = "Yeah huh!",
Post = p
}
);
p.Comments.Add(
new Comment()
{
Body = "Third Reich.",
Post = p
}
);
p2.Comments.Add(
new Comment
{
Body = "I laughed, I cried!",
Post = p2
}
);
System.Diagnostics.Debug.WriteLine(a.Name); // "Jason Hater"…great!
context.SaveChanges();
System.Diagnostics.Debug.WriteLine(a.Name); // a.Name is null -> empty string!
}
// …
}
Run Code Online (Sandbox Code Playgroud)
更多的是,因为现在@
不是 "修复"它 - 现在我仍然在测试方法中看到无效我之前看到它是正确的......另一个中的某些东西[TestMethod]
可能有所作为,也许......不确定,仍然调查.不过,为什么会context.SaveChanges()
发生变化呢?
呃,好吧......不知怎的StoreGeneratedPattern
,我的财产上的Name
财产在建模GUI中设置为"身份".不知道那是怎么回事.将其更改为"无"可能已经消除了我的问题.但是......我知道当我认为这个@
符号已经固定时,我没有改变它......这里的东西还很奇怪.
不管怎样,错误的价值StoreGeneratedPattern
是我的分配/保存问题的原因.我不确定为什么我用该设置观察了一次或多次成功,但原始问题不再是正确的问题.
在 C# 中@
,如果要将关键字转换为标识符,请使用 。由于Name
没有关键字,所以根本没有任何作用。
这纯粹是一个 C# 规则,在 IL 级别,@
即使标识符的名称与 C# 关键字匹配,也不会再出现。因此实体框架不可能检测到差异。