此时纯粹好奇,因为@
解决了我遇到的问题,但为什么Name
特殊?
我有一个名为Name
的EF实体属性...如果我没有将@
放在Name
前面,我不会收到任何错误,但{对象上的{1}}属性未分配。如果我将Name
放入对象初始值设定项中,则会正确分配@Name
:
Name
我检查了生成的代码,它只是命名为a = new Author
{
Id = Guid.NewGuid().ToString(),
@Name = "Jason Hater" // Apparently "Name" is quasi-reserved or something...?!?
};
:
Name
因此,[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
[DataMemberAttribute()]
public global::System.String Name
{
get
{
return _Name;
}
//...
}
未列为keyword,为什么它很特别?
好的,正如@sergey建议的那样,它肯定比我想象的要复杂一点。特别是关于实体框架的蠢事。
这在单元测试类中表现出来,也可能是相关的。我不确定什么是相关的,什么不是现在不幸的,所以这里是整个Name
方法,在它的底部你可以看到奇怪的事发生在[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!
}
// …
}
不是“修复”它 - 现在我仍然在测试方法中看到null我之前看到它正确...另一个@
中的某些东西可能有所作为,也许......不确定,仍在调查中。不过,为什么围绕[TestMethod]
发生了变化?
呃,好吧......我的context.SaveChanges()
属性上的StoreGeneratedPattern
属性在建模GUI中被设置为“Identity”。不知道那是怎么回事。将其更改为“无”可能已经消除了我的问题。但是......我知道当我认为Name
符号已修复它时,我没有改变它......这里的东西仍然很奇怪。
@
的错误值是我的分配/保存问题的原因之一。我不确定为什么我用这个设置观察了一次或多次成功,但原来的问题不再是正确的问题。
答案 0 :(得分:2)
在C#中,如果要将关键字转换为标识符,则使用@
。由于Name
不是关键字,因此根本没有效果。
这纯粹是一个C#规则,在IL级别,@
将不再存在,即使标识符的名称与C#关键字匹配。因此,Entity Framework无法检测到差异。
答案 1 :(得分:0)
“为什么我必须在对象初始值设定项中将@放在Name
前面?” - 你没有,你的问题在其他地方,因为评论者已经建议。
执行DbContext.SaveChanges
时,对象图中对象的更改方式是与给定属性映射关联的StoreGeneratedPattern
。
检查StoreGeneratedPattern
映射是否与Author.Name
相关联。