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

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()发生变化呢?

编辑2

呃,好吧......不知怎的StoreGeneratedPattern,我的财产上的Name财产在建模GUI中设置为"身份".不知道那是怎么回事.将其更改为"无"可能已经消除了我的问题.但是......我知道当我认为这个@符号已经固定时,我没有改变它......这里的东西还很奇怪.

编辑3

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

Lok*_*oki 2

在 C# 中@,如果要将关键字转换为标识符,请使用 。由于Name没有关键字,所以根本没有任何作用。

这纯粹是一个 C# 规则,在 IL 级别,@即使标识符的名称与 C# 关键字匹配,也不会再出现。因此实体框架不可能检测到差异。