C# 如何使用实体框架和ASP.NET MVC允许外键以null形式保存在数据库中?

C# 如何使用实体框架和ASP.NET MVC允许外键以null形式保存在数据库中?,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我的数据库中有三个表:超级经销商、次级经销商和佣金 Superdealer中的Id:SuperdealerId 子经销商中的Id:子经销商Id 佣金中的Id:佣金Id。它有两个外键SuperdealerId和subdealerId 有一个下拉列表,让我选择是将佣金分配给次级经销商还是超级经销商本身。若我选择sub dealer,则必须将值分配给subdealerid,并且superdealerid应为null。如果我选择superdealer,它应该被赋值,subdealerid应该为nul

我的数据库中有三个表:
超级经销商
次级经销商
佣金

  • Superdealer中的Id:
    SuperdealerId
  • 子经销商中的Id:
    子经销商Id
  • 佣金中的Id:
    佣金Id
    。它有两个外键
    SuperdealerId
    subdealerId
有一个下拉列表,让我选择是将佣金分配给次级经销商还是超级经销商本身。若我选择sub dealer,则必须将值分配给subdealerid,并且superdealerid应为null。如果我选择superdealer,它应该被赋值,subdealerid应该为null

我尝试了以下代码,但此代码不属于我的问题

 modelBuilder .Entity<Commission>()
                    .HasOptional<SuperDealer>(u => u.SuperDealer)
                    .WithOptionalPrincipal();
 modelBuilder .Entity<Commission>()
                    .HasOptional<SubDealer>(u => u.SubDealer)
                    .WithOptionalPrincipal();

public class Commission
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CommissionId { get; set; }


    //[Display(Name ="Selected Dealer Name")]
    //public string DealerName { get; set; }
    [Range(0, double.MaxValue, ErrorMessage = "Please enter valid 
    commission")]
    [Display(Name = "Commission Percentage")]
    public double CommissionPercentage { get; set; }

    [DataType(DataType.Date)]
    [Display(Name = "Commission Start Date")]
    public DateTime CommissionStart { get; set; }
    [Display(Name = "First Commission")]
    [Range(0, int.MaxValue, ErrorMessage = "Please enter valid number")]
    public int firstCommissionPart { get; set; }
    [Display(Name = "Second Commission")]
    [Range(0, int.MaxValue, ErrorMessage = "Please enter valid number")]
    public Nullable<int> secondCommissionPart { get; set; }
    [Display(Name = "Third Commission")]
    [Range(0, int.MaxValue, ErrorMessage = "Please enter valid number")]
    public Nullable<int> thirdCommissionPart { get; set; }

    [ForeignKey("SubDealerId")]
    public SubDealer SubDealer { get; set; }
    [Display(Name = "Select Sub dealer")]
    public int? SubDealerId { get; set; }

    [ForeignKey("SuperDealerId")]
    public SuperDealer SuperDealer { get; set; }
    [Display(Name = "Select Super dealer")]
    public int? SuperDealerId { get; set; }

 }
modelBuilder.Entity()
.HAS可选(u=>u.SuperDealer)
.使用OptionalPrincipal();
modelBuilder.Entity()
.HAS可选(u=>u.次级经销商)
.使用OptionalPrincipal();
公开课委员会
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
public int CommissionId{get;set;}
//[显示(Name=“所选经销商名称”)]
//公共字符串DealName{get;set;}
[范围(0,double.MaxValue,ErrorMessage=”请输入有效值
委员会“)]
[显示(Name=“佣金百分比”)]
公共双委托百分比{get;set;}
[数据类型(DataType.Date)]
[显示(Name=“佣金开始日期”)]
public DateTime CommissionStart{get;set;}
[显示(Name=“首次佣金”)]
[范围(0,int.MaxValue,ErrorMessage=“请输入有效数字”)]
公共int firstCommissionPart{get;set;}
[显示(Name=“第二次佣金”)]
[范围(0,int.MaxValue,ErrorMessage=“请输入有效数字”)]
公共可为空的secondCommissionPart{get;set;}
[显示(Name=“第三委员会”)]
[范围(0,int.MaxValue,ErrorMessage=“请输入有效数字”)]
公共可为空的thirdCommissionPart{get;set;}
[外国密钥(“子Dealerid”)]
公共子交易商子交易商{get;set;}
[显示(Name=“选择子经销商”)]
public int?SubDealerId{get;set;}
[ForeignKey(“SuperDealerId”)]
公共超级交易商超级交易商{get;set;}
[显示(Name=“选择超级经销商”)]
public int?SuperDealerId{get;set;}
}
这是向经销商收取佣金的代码

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "CommissionId,CommissionPercentage,CommissionStart,firstCommissionPart,secondCommissionPart,thirdCommissionPart,SubDealerId,SuperDealerId")] Commission commission, FormCollection fc)
{
        //var superdealer = Request.Form["SuperDealerId"];
        //var subdealer = Request.Form["SubDealerId"];
        int superdealer = int.Parse(fc["SuperDealerId"]);
        int subdealer = int.Parse(fc["SubDealerId"]);


        if (ModelState.IsValid)
        {
            if (superdealer > 0 && subdealer > 0)
            {
                commission.SubDealerId = subdealer;
            }
            else if (superdealer > 0)
            {
                commission.SuperDealerId = superdealer;
            }
            db.Commissions.Add(commission);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        List<SelectListItem> plans = new List<SelectListItem>();

        plans.Add(new SelectListItem { Text = "QM Plan", Value = "1", Selected = true });

        plans.Add(new SelectListItem { Text = "Customized Plan", Value = "2" });
        ViewBag.Plans = plans;
        ViewBag.SubDealerId = new SelectList(db.SubDealers, "SubDealer_No", "Name", commission.SubDealerId);
        ViewBag.SuperDealerId = new SelectList(db.SuperDealers, "SuperDealer_No", "Name", commission.SuperDealerId);
        return View(commission);
}
[HttpPost]
[ValidateAntiForgeryToken]
公共操作结果创建([Bind(Include=“CommissionId,CommissionPercentage,CommissionStart,firstCommissionPart,secondCommissionPart,thirdCommissionPart,SubDealerId,SuperDealerId”)]佣金,FormCollection fc)
{
//var superdealer=Request.Form[“SuperDealerId”];
//var subdealer=请求。表单[“SubDealerId”];
int superdealer=int.Parse(fc[“SuperDealerId”]);
int subdealer=int.Parse(fc[“SubDealerId”]);
if(ModelState.IsValid)
{
如果(超级经销商>0和次级经销商>0)
{
佣金.SubDealerId=次级经销商;
}
否则如果(超级经销商>0)
{
commission.SuperDealerId=超级经销商;
}
db.佣金增加(佣金);
db.SaveChanges();
返回操作(“索引”);
}
列表计划=新列表();
添加(新建SelectListItem{Text=“QM Plan”,Value=“1”,Selected=true});
添加(新建SelectListItem{Text=“Customized Plan”,Value=“2”});
ViewBag.Plans=计划;
ViewBag.SubDealerId=新选择列表(db.subderalers,“subderaler\u No”,“Name”,commission.SubDealerId);
ViewBag.SuperDealerId=新选择列表(db.SuperDealers,“SuperDealer\u No”,“Name”,commission.SuperDealerId);
返回视图(委员会);
}
我想要的是

  • 超级经销商下可以有多个子经销商。有一个下拉列表,让我选择是将佣金分配给次级经销商还是超级经销商本身。若我选择sub dealer,则必须将值分配给subdealerid,并且superdealerid应为null。如果我选择superdealer,它应该被赋值,subdealerid应该为null
    单击时,出现以下错误:

    结构的具体程度如何?您能否将佣金更改为佣金ID、DealerID和DealerType?然后,在佣金中添加任意ID(次级经销商或超级经销商),并指明类型。结构有多具体?您能否将佣金更改为佣金ID、DealerID和DealerType?然后,您向佣金中添加任意ID(次级经销商或超级经销商),并指明类型。