2015-05-09 2 views
1

Я могу сказать глупый вопрос вам, но я действительно хочу это знать.EF Добавить метод Идентификация Значение столбца

в Entity Framework (EF) в контексте класса DbSet, когда мы называем Add (объект) метод, как обновить столбец 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

Это объясняется гораздо более подробно в C# documentation типов, но здесь суть его:

  1. Типы значений элементы, такие как int, bool, любой struct и т.д. Эти блоки памяти которые имеют определенную ценность.
  2. Референтные типы - это такие предметы, как 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 
+0

+1 спасибо. Фактически ошибка, которую я делал, похожа на ваш случай, когда я повторно инициализировал объект MyClass, вместо этого менял только MyInt. Благодаря :) –

Смежные вопросы