EF添加方法标识列值

时间:2015-05-09 20:03:02

标签: c# entity-framework out ref

我可能听起来很愚蠢,但我真的很想知道它。

在实体框架(EF)上的上下文类 DbSet 当我们调用添加(对象)方法时,它如何更新实体上的Id列。我的意思是如果它使用" REF"和" OUT"我们可以理解它如何更新ID字段,但这里不使用REF和OUT如何在对象属性下。??

//model.ID   -- here its zero
context.Entry(model).State = EntityState.Added;
context.SaveChanges();
//model.ID   -- here its no zero

1 个答案:

答案 0 :(得分:1)

C# documentation类型更详细地解释了这一点,但这里有它的要点:

  1. 值类型包括intbool,任何struct等项目。这些是包含不同值的内存块。
  2. 引用类型包括stringobject,任何class等项目。这些实际上只是对存储其值的内存块的“引用”。
  3. 如果将值类型作为参数传递给方法,则该值实际上会复制到新的内存块中,并且方法中的代码无法修改原始值。

    public static void Main()
    {
    
        int myInt = 5;
    
        Console.WriteLine(myInt);
        ChangeMe(myInt);
        Console.WriteLine(myInt);
    }
    
    public static void ChangeMe(int i)
    {
        i = 7;
    }
    // Outputs:
    // 5
    // 5
    

    要修改值类型,您必须使用“ref”或“out”参数。

    public static void Main()
    {
    
        int myInt = 5;
    
        Console.WriteLine(myInt);
        ChangeMe(ref myInt);
        Console.WriteLine(myInt);
    }
    
    public static void ChangeMe(ref int i)
    {
        i = 7;
    }
    // Outputs:
    // 5
    // 7
    

    但是,这不适用于已经引用类型的类型。通常,在实体框架中,您使用设置为class个对象的类型。默认情况下,这些是引用类型。将引用类型传递给方法并不像值类型那样“复制”它,该方法可以访问原始对象。这是因为您只是将一个位置传递到该记忆所在的位置。这表明允许该方法修改类的值。

    public class MyClass 
    {
        public int MyInt { get; set; }
    }
    
    public static void Main()
    {
    
        MyClass myclass = new MyClass();
        myclass.MyInt = 5;
    
        Console.WriteLine(myclass.MyInt);
        ChangeMe(myClass);
        Console.WriteLine(myclass.MyInt);
    }
    
    public static void ChangeMe(MyClass i)
    {
        i.MyInt = 7;
    }
    // Outputs:
    // 5
    // 7