簡體   English   中英

在多對多關系中插入失敗

[英]Insert Fails in Many-to-Many Relationship

我正在一個實體框架代碼優先項目中工作,該項目具有多對多關系:ServiceProvider和ServiceType

向存儲庫中添加新的ServiceProvider時出現以下錯誤:無法將值NULL插入表“ ABCDE.dbo.ServiceTypes”的“ ID”列中; 列不允許為空。 INSERT失敗。

實體和控制器類如下:

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

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

我不確定為什么未使用正確的數據填充數據庫表ServiceTypeServiceProviders(由EF自動生成)。 什么都沒有存儲到其中。 通過在調試時查看serviceProvider對象,我可以看到一切似乎都很好(請參見下圖)

在此處輸入圖片說明

我用以下數據手動填充了ServiceType表(與枚舉匹配)

在此處輸入圖片說明

我假設您正在創建並添加到ServiceProvider關聯中的“新” ServiceType對象是對您手動插入ServiceType表中的數據的引用,而不是對新對象的引用。如果是這樣,您要么想要從DbContext中檢索對象,而不是創建一個新對象,否則,您必須使用context.Set<ServiceType>.Attach(serviceType);將“新” ServiceType對象附加到當前DbContext context.Set<ServiceType>.Attach(serviceType); context.Entry(serviceType).State = EntityState.Attached; 這些可能需要為ServiceType對象分配ID屬性,以確保它正確映射到現有實體。 這將確保插入時在ServiceType表中不會出現空ID或重復的條目。

如果這不能解決問題,我們將必須查看InsertServiceProvider的代碼才能更好地了解如何將ServiceProvider實體添加到DbContext中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM