我可能听起来很愚蠢,但我真的很想知道它。
在实体框架(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
答案 0 :(得分:1)
C# documentation类型更详细地解释了这一点,但这里有它的要点:
int
,bool
,任何struct
等项目。这些是包含不同值的内存块。 string
,object
,任何class
等项目。这些实际上只是对存储其值的内存块的“引用”。 如果将值类型作为参数传递给方法,则该值实际上会复制到新的内存块中,并且方法中的代码无法修改原始值。
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