gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:58:16 26 4
gpt4 key购买 nike

在这一点上纯属好奇,因为 @ 解决了我遇到的问题,但为什么 Name 很特别?

我有一个名为 Name 的 EF 实体属性......如果我不把 @ 放在 Name 前面,我就不会收到任何类型的错误,但未分配对象的 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;
}

//...
}

因此,Name 没有列为 keyword ,那么它为什么特别呢?

编辑

好吧,正如@sergey 所建议的,它肯定比我最初想象的要复杂一些。 Entity Framework 有些愚蠢。

这体现在单元测试类中,可能也相关。不幸的是,我现在不确定什么是相关的,什么不是,所以这是整个 [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() 发生变化?

编辑2

呃,好吧……不知何故,我的 Name 属性上的 StoreGeneratedPattern 属性在建模 GUI 中被设置为“Identity”。不知道那是怎么发生的。将其更改为“无”可能已经解决了我的问题。但是......我知道当我认为 @ 符号已经修复它时我没有改变它......这里仍然有些奇怪。

编辑3

不管怎样,StoreGeneratedPattern 的错误值是我的分配/保存问题的原因。我不确定为什么我在该设置下观察到一次或多次成功,但原来的问题不再是正确的问题。

最佳答案

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

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

关于c# - 为什么我必须在对象初始值设定项中将 @ 放在 `Name` 前面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21988280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com