0

ich arbeite auf einer Entity Framework-Code Erstes Projekt, wo ich viele-zu-viele Beziehungen haben: Serviceprovider und ServicetypeInsert schlägt fehl, in Many-to-Many Beziehung

ich die folgende Fehlermeldung erhalten, wenn eine neue Serviceprovider-Zugabe in das Repository: Der Wert NULL kann nicht in Spalte 'ID' eingefügt werden, Tabelle 'ABCDE.dbo.ServiceTypes'; Spalte erlaubt keine Nullen. INSERT schlägt fehl.

die Entität und Controller-Klassen sind wie folgt:

ServiceProvider.cs:

public partial class ServiceProvider 
{ 
    public ServiceProvider() 
    { 
     ServiceTypes = new HashSet<ServiceType>(); 
    } 

    [Key] 
    public int ServiceProviderID { get; set; } 

    [Required] 
    [StringLength(100)] 
    public string Title { get; set; } 

    public virtual ICollection<ServiceType> ServiceTypes { get; set; } 

    public virtual IEnumerable<Service> Services { get; set; } 

} 

ServiceType.cs:

public partial class ServiceType 
{ 
    public ServiceType(ServiceTypeEnum @enum) 
    { 
     ID = (int) @enum; 
     Name = @enum.ToString(); 
    } 

    protected ServiceType() { } // For EF 

    //[Key, DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int ID { get; set; } 

    [Required, MaxLength(100)] 
    public string Name { get; set; } 

    public virtual ICollection<ServiceProvider> ServiceProviders { get; set; } 

    public static implicit operator ServiceType(ServiceTypeEnum @enum) => new ServiceType(@enum); 

    public static implicit operator ServiceTypeEnum(ServiceType serviceType) => (ServiceTypeEnum) serviceType.ID; 
} 


public enum ServiceTypeEnum 
{ 
    Ambulance = 1, 
    [Display(Name = "Cash Advance")] 
    CashAdvance = 2, 
    Hospitalization = 3, 
    Hotel = 4, 
    [Display(Name = "House Call")] 
    HouseCall = 5, 
    [Display(Name = "Medical Escort")] 
    MedicalEscort = 6, 
    Transfer = 7, 
    Repatriation = 8 
} 

und die ServiceProviderController.cs:

public ActionResult Create() 
    { 
     var _allServiceTypes = Enum.GetValues(typeof(ServiceTypeEnum)) 
      .Cast<ServiceTypeEnum>() 
      .Select(t => new KeyValuePair<string, int>(t.ToString(), (int) t)); 

     var viewModel = new ServiceProviderViewModel.CreateModel() 
     { 
      AllServiceTypes = _allServiceTypes 
     }; 

     return View(viewModel); 
    } 

    [HttpPost] 
    public ActionResult Create(ServiceProviderViewModel.CreateModel viewModel) 
    { 
     if (ModelState.IsValid) 
     { 

      var serviceProvider = new ServiceProvider(); 
      serviceProvider.Title = viewModel.Title;    

      repository.InsertServiceProvider(serviceProvider); 

      for (int i = 0; i < viewModel.SelectedServiceTypes.Length; i++) 
      { 
       var _serviceType = new ServiceType((ServiceTypeEnum)Enum.Parse(typeof(ServiceTypeEnum), viewModel.SelectedServiceTypes[i].ToString())); 
       serviceProvider.ServiceTypes.Add(_serviceType); 
      } 

      repository.Save(); 

      return RedirectToAction("Index"); 
     } 
     return View(viewModel); 
    } 

Ich bin nicht sicher, warum die Datenbanktabelle ServiceTypeServiceProviders (automatisch von EF erzeugt) nicht mit den korrekten Daten gefüllt. Nichts wird darin gespeichert. Mit Blick auf dem serviceprovider-Objekt beim Debuggen, kann ich sehen, dass alles in Ordnung zu sein scheint (siehe Bild unten)

enter image description here

ich die Servicetype Tabelle manuell mit den folgenden Daten gefüllt (passend zum Enum)

enter image description here

+0

Was ist 'ServiceProvider' und' ServiceType', Sind sie gespeichert? –

+0

Nein, sie werden nicht gespeichert ... – burakk

+0

Gibt es einen Aufruf von 'SaveChanges'? Oder sehen Sie vielleicht die falsche Datenbank? –

Antwort

0

ich die „neue“ Servicetype Objekt gehe mal davon aus das Sie erstellen und das Hinzufügen von den Verbänden für den Serviceprovider ist ein Verweis auf die Daten, die Sie manuell in die Servicetype-Tabelle eingefügt und kein neues Objekt ... Wenn also willst du entweder re Rufen Sie das Objekt vom DbContext ab, anstatt ein neues Objekt zu erstellen, oder Sie müssen das "neue" ServiceType-Objekt an den aktuellen DbContext anhängen, indem Sie entweder context.Set<ServiceType>.Attach(serviceType); oder context.Entry(serviceType).State = EntityState.Attached; verwenden. Diese erfordern möglicherweise die Zuweisung der ID-Eigenschaft für das ServiceType-Objekt, um sicherzustellen, dass es den vorhandenen Entitäten korrekt zugeordnet wird. Dadurch wird sichergestellt, dass Sie beim Einfügen keine Null-ID oder doppelte Einträge in der ServiceType-Tabelle erhalten.

Wenn dies das Problem nicht beheben, würden wir den Code für InsertServiceProvider sehen müssen, um eine bessere Vorstellung davon zu bekommen, wie Sie die Serviceprovider-Instanz an die DbContext hinzufügen

+0

Danke Alex, du hast Recht. Das Problem war, dass der Code ein neues Objekt erstellte. Ich habe den Code geändert, um die bereits in der Tabelle vorhandenen Daten abzurufen, und jetzt funktioniert alles einwandfrei. Danke noch einmal. – burakk

+0

Gerne helfen! Viele-zu-viele Beziehungen mit EF haben so viele Gotchas :) – Alex