为什么我必须在对象初始值设定项中将@放在`Name`前面?

时间:2014-02-24 12:48:30

标签: c# .net database entity-framework

此时纯粹好奇,因为@解决了我遇到的问题,但为什么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]发生了变化?

编辑2

呃,好吧......我的context.SaveChanges()属性上的StoreGeneratedPattern属性在建模GUI中被设置为“Identity”。不知道那是怎么回事。将其更改为“无”可能已经消除了我的问题。但是......我知道当我认为Name符号已修复它时,我没有改变它......这里的东西仍然很奇怪。

编辑3

@的错误值是我的分配/保存问题的原因之一。我不确定为什么我用这个设置观察了一次或多次成功,但原来的问题不再是正确的问题。

2 个答案:

答案 0 :(得分:2)

在C#中,如果要将关键字转换为标识符,则使用@。由于Name不是关键字,因此根本没有效果。

这纯粹是一个C#规则,在IL级别,@将不再存在,即使标识符的名称与C#关键字匹配。因此,Entity Framework无法检测到差异。

答案 1 :(得分:0)

“为什么我必须在对象初始值设定项中将@放在Name前面?” - 你没有,你的问题在其他地方,因为评论者已经建议。

执行DbContext.SaveChanges时,对象图中对象的更改方式是与给定属性映射关联的StoreGeneratedPattern

检查StoreGeneratedPattern映射是否与Author.Name相关联。