2016-08-12 1 views
0

J'ai Entity Framework Code Premiers modèles. Lorsque j'essaie de sauvegarder la collection de comptes dans un insert, j'obtiens un message d'erreur.Entity Framework enregistrer la collection

public class User 
{ 
    [Key] 
    public int Usr_Id { get; set; } 
    [Required] 
    [MaxLength(35)] 
    public string Name { get; set; } 
    [Required] 
    [MaxLength(35)] 
    public string Surname { get; set; } 
    [Required] 
    [MaxLength(35)] 
    public string Location { get; set; }   

    //NAVIGATION 
    public User() 
    { 
     UserDevices = new List<UserDevice>(); 
    } 

    public virtual ICollection<UserDevice> UserDevices { get; set; } 

} 

public class UserDevice 
{ 
    [Key] 
    public int UsrDev_Id { get; set; } 
    [Required] 
    [MaxLength(50)] 
    public string PurposeOfUse { get; set; } 

    // NAVIGATION 

    public UserDevice() 
    { 
     Accounts = new List<Account>(); 
    } 

    //User can have many UserDevice 
    public int Usr_Id { get; set; }   
    public virtual User User { get; set; } 

    //UserDevice can have many Acoount 
    public virtual ICollection<Account> Accounts { get; set; } 

    //One to one 
    public virtual SoftwareInformation SoftwareInformation { get; set; } 
    public virtual HardwareInformation HardwareInformation { get; set; } 
} 

public class Account 
{ 
    [Key] 
    public int Acc_Id { get; set; } 
    public string Name { get; set; } 

    //NAVIGATION 

    //UserDevice can have many Account 
    public int UsrDev_Id { get; set; } 
    public virtual UserDevice UserDevice { get; set; } 

} 

Insérer de nouveaux UserDevice

List<Account> accountsList = new List<Account>(); 

      foreach (var item in model.DeviceInformations.OS.Accounts) 
      { 
       accountsList.Add(new Account { Name = item.Name }); 
      }    


      _unitOfWork.UserDevices.Add(new UserDevice 
      { 
       Usr_Id = model.Usr_Id, 
       PurposeOfUse = model.PurposeOfUse, 

       HardwareInformation = new HardwareInformation 
       { 
        MB_Manufacturer = model.DeviceInformations.Motherboard.Manufacturer, 
        MB_Model = model.DeviceInformations.Motherboard.Model, 
        MB_Name = model.DeviceInformations.Motherboard.Name, 
        MB_UUID = model.DeviceInformations.Motherboard.UUID, 
        CPU_Manufacturer = model.DeviceInformations.Processor.Manufacturer, 
        CPU_MaxClockSpeed = model.DeviceInformations.Processor.MaxClockSpeed, 
        CPU_Name = model.DeviceInformations.Processor.Name, 
       }, 

       SoftwareInformation = new SoftwareInformation 
       { 
        OS_Edition = model.DeviceInformations.OS.Edition, 
        OS_HostName = model.DeviceInformations.OS.HostName, 
        OS_Language = model.DeviceInformations.OS.Language, 
        OS_Platform = model.DeviceInformations.OS.Platform, 
        OS_ProductKey = model.DeviceInformations.OS.ProductKey, 
        OS_ServicePackVersion = model.DeviceInformations.OS.ServicePackVersion, 
        OS_Version = model.DeviceInformations.OS.Version 
       }, 

       Accounts = accountsList 
      }); 
      _unitOfWork.Commit(); 

Message d'erreur

{ "Impossible d'insérer la valeur NULL dans la colonne 'ACC_ID', table 'LICENSE_WATCHER_TEST.dbo.Accounts'; colonne ne L'INSERT échoue. \ r \ nLa déclaration a été terminée. "}

Ça se passe quand j'essaie de sauvegarder la collection Accout. Existe-t-il un moyen de sauvegarder la collection Accouts dans un insert?

Répondre

1

ACC_ID est nulle sur insert. Je m'attendrais à ce que cette identification soit générée automatiquement dans des cas comme celui-ci. Est-il possible que vous ayez la colonne Acc_id sur la table de compte configurée comme PK, mais pas une colonne d'identité dans la base de données?

Cela peut provoquer le comportement que vous rencontrez.

+1

L'identité n'a pas vraiment été définie dans la base de données. Le problème était dans la configuration api courante. – Michal

0

Eh bien, vous avez Acc_Id défini comme clé Primay et il semble que vous essayez d'insérer une valeur nulle à la table.

Ici vous créer une liste de compte, mais vous ne remplir que Name

 foreach (var item in model.DeviceInformations.OS.Accounts) 
     { 
      accountsList.Add(new Account { Name = item.Name }); 
     }  

Et vous ne faites pas des changements dans accountsList commettent Avant de faire Accounts = accountsList qui n'a pas Id rempli et vous essayer de commettre.

Essayez quelque chose comme ceci:

 foreach (var item in model.DeviceInformations.OS.Accounts) 
     { 
      accountsList.Add(new Account { Acc_Id = !!someIdHere!!, Name = item.Name }); 
     }