2016-04-13 2 views
1

Я действительно нового в EF, и я suddenyl застрял с проблемой:Соотношение столбцов и сущностей Entity Framework?

 var _entity = new TestEntity(); 

     _entity.Customers.Add(new Customers { Description = "John" }); 
     _entity.Customers.Add(new Customers { Customer_ID = 1, Description = "Steve" }); 

     try 
     { 
      _entity.SaveChanges(); 
     } 
     catch (System.Data.Entity.Validation.DbEntityValidationException) 
     { 
      Debug.Print("Validation Error"); 
     } 

После выполнения этого кода, я получил результат, который insterted две записи без каких-либо исключений, но моя проблема что поле Customer_ID не разрешает null или не определяет значение по умолчанию. Тем не менее, «John» -record вставил с Customer_ID: 0. (И, конечно же, «Steve» -рекорд также, с правильным ID: 1)

Как я могу обойтись, или, по крайней мере, еще глубже угадывать, прежде чем вставлять значения, а если не определять код, держитесь подальше от вставки?

Модель класса здесь:

[Key] 
    [Column(Order = 0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Customer_ID { get; set; } 

    [Column(Order = 1)] 
    [StringLength(50)] 
    public string Description { get; set; } 

Спасибо

ответ

1

Значение по умолчанию для междунар является 0, который не является нулевым, и вы были в состоянии вставить его в БД. Если вы хотите проверить, присвоен ли Client_ID более большому значению, чем 0, вы можете попробовать атрибут Range.

[Key] 
[Column(Order = 0)] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
[Range(1, Int32.MaxValue, ErrorMessage = "Value for {0} must be larger than 0.")] 
public int Customer_ID { get; set; } 

Другой некрасиво решение может быть маркировка изменения типа собственности на int? и применения атрибута Required так:

[Key] 
[Column(Order = 0)] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
[Required] 
public int? Customer_ID { get; set; } 
+0

@GertArnold Спасибо за исправление –

-1

Это не ясно, если вы хотите для Customer_ID принять нуль или нет? public int Customer_ID {get; задавать; } имеет значение по умолчанию 0, так что вы получаете правильно.

если необходимо попробовать:

[Required] 
public int Customer_ID { get; set; } 

, если он может быть пустым

public int? Customer_ID { get; set; } 
+0

Хорошо, в определении таблицы со стороны SQL Customer_ID не разрешает null. В моем коде я не определяю значение для записи John-record, поэтому это означает - с моей точки зрения, я не даю значения для Customer_ID, поэтому он должен быть пустым по умолчанию и получить исключение, которое вы не определяете значение для ID. – user1692315

+1

Ну, в C# у вас есть свойство Customer_ID типа int, и это означает, что значение по умолчанию Customer_ID равно 0. Таким образом, если вы хотите, чтобы в db отображался NULL, у вас должен быть тип с нулевым значением, как property ex: public int? Customer_ID {get; задавать; }. И тогда новые строки будут иметь нуль. – Catalin

+0

После этого вы должны добавить новую строку, чтобы увидеть ее работу. – Catalin

1

Хорошо, я получил его.

Так что я должен подписать значение, как Nullable:

[Key] 
[Column(Order = 0)] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
public int? Customer_ID { get; set; } 

И в этом случае, я только что получил DbUpdateException. Возможно, решение, но, возможно, не лучшее, поэтому другие предложения по-прежнему приветствуются.

+1

Вот что я делаю. –

1

На стороне базы данных я настоятельно рекомендую установить ограничение CHECK на Customer_ID, чтобы оно не позволяло 0. Это предотвратит утечку ошибок в приложении из базы данных.

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