0

に失敗しますテーブル 'ABCDE.dbo.ServiceTypes';列 'ID'に値NULLを挿入できません。列はNULLを許可しません。 INSERTは失敗します。挿入は私が多対多の関係を持つEntity Frameworkのコードファーストプロジェクトに取り組んでいます多対多の関係

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 
} 

ServiceProviderController.csを次のように

エンティティとコントローラクラスがあります:(自動EFによって生成された)データベーステーブルServiceTypeServiceProvidersは、正しいデータが取り込まれていない理由を

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); 
    } 

私はわかりません。それには何も格納されません。デバッグしながら、サービス・プロバイダのオブジェクトを見て、私はすべてが正常であると考えられることがわかります(下の画像を参照)

enter image description here

私は

(列挙型に一致する)は、次のデータを使用して手動でサービス種別テーブルを埋め

enter image description here

+0

にあなたがのServiceProviderエンティティを追加する方法のより良いアイデアを得るためにInsertServiceProviderのコードを参照してくださいする必要があります、彼らは保管されていますか? –

+0

いいえ、それらは保存されていません... – burakk

+0

そこには 'SaveChanges'呼び出しはありますか?あるいは間違ったデータベースを見ているのでしょうか? –

答えて

0

私はあなたが作成してのServiceProviderのために協会に追加されている「新」のServiceTypeオブジェクトは手動でサービス・タイプのテーブルではなく、新しいオブジェクトに挿入されたデータへの参照であると仮定している...場合だから、もう一度やり直したい新しいオブジェクトを作成するのではなく、オブジェクトをDbContextから削除するか、context.Set<ServiceType>.Attach(serviceType);またはcontext.Entry(serviceType).State = EntityState.Attached;のいずれかを使用して、現在のDbContextに「新しい」ServiceTypeオブジェクトを追加する必要があります。これらは、既存のエンティティに正しくマッピングされるようにServiceTypeオブジェクトのIDプロパティを割り当てる必要があります。これにより、ヌルIDを取得したり、挿入時にServiceTypeテーブルにエントリを重複させたりすることがなくなります。

これで問題が解決しない場合、我々は `ServiceProvider`と` ServiceType`についてどうDbContext

+0

アレックス、ありがとうございました。問題は、コードが新しいオブジェクトを作成していることでした。私はすでにテーブルにあるデータを取得するようにコードを変更しましたが、今はすべて正常に動作しています。再度、感謝します。 – burakk

+0

お手伝いします! EFとの多対多関係には多くの問題があります:) – Alex