Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 使用ASP.NET MVC存储多对多关系的附加信息集_Asp.net Mvc_Entity Framework_Many To Many - Fatal编程技术网

Asp.net mvc 使用ASP.NET MVC存储多对多关系的附加信息集

Asp.net mvc 使用ASP.NET MVC存储多对多关系的附加信息集,asp.net-mvc,entity-framework,many-to-many,Asp.net Mvc,Entity Framework,Many To Many,存储多对多关系的附加信息 我有以下两个实体,它们与以下模型存在多对多关系- 疾病 公共类疾病 { 公共疾病() { this.Indications=newhashset(); this.LaboratoryParameters=new HashSet(); this.Medicines=newhashset(); } [关键] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public Int32 DiseaseI

存储多对多关系的附加信息

我有以下两个实体,它们与以下模型存在多对多关系-

疾病
公共类疾病
{
公共疾病()
{
this.Indications=newhashset();
this.LaboratoryParameters=new HashSet();
this.Medicines=newhashset();
}
[关键]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public Int32 DiseaseID{get;set;}
[必需]
[显示(Name=“Disease”)]
[长度(100)]
公共字符串DiseaseName{get;set;}
公共虚拟ICollection指示{get;set;}
公共虚拟ICollection LaboratoryParameters{get;set;}
公共虚拟ICollection药品{get;set;}
}
公共级医学
{
公共医学()
{
this.Diseases=newhashset();
}
[关键]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
公共Int32 MedicineID{get;set;}
[必需]
[长度(100)]
[显示(名称=“通用名称”)]
公共字符串Medicine\u Generic\u Name{get;set;}
[必需]
[长度(100)]
[显示(名称=“商品名”)]
公共字符串Medicine\u Trade\u Name{get;set;}
[必需]
[第15段]
[显示(Name=“可用性”)]
公共字符串可用性{get;set;}
[必需]
[显示(Name=“空闲次数”)]
公共Int32 Medicine_TimesFree{get;set;}
公共虚拟ICollection{get;set;}
}
我想在连接疾病和医疗实体的第三个表中存储更多信息。特别是因为这个“连接”表没有模型定义,我该怎么做?此外,我需要提到的是,我想为一种疾病和一种药物之间的关联存储多组信息。所以,例如

对于疾病和药物的一种组合,可以有任意数量的记录,其中包含以下附加信息-

效力、扭矩、药片数量、每天次数、剂量价格(美元)


请建议。

您也可以将您的“加入”实体映射到模型中,并根据需要添加任意数量的额外属性

请参见下面的多对多示例


多对多:自定义联接实体

我必须承认,我并不真正喜欢让EF推断没有连接实体的连接表。您无法跟踪个人-汽车关联的额外信息(例如,它的有效日期),因为您无法修改该表

此外,联接表中的
CarId
是主键的一部分,因此如果家庭购买新车,您必须首先删除旧关联并添加新关联。EF对您隐藏了这一点,但这意味着您必须执行这两个操作,而不是简单的更新(更不用说频繁的插入/删除可能会导致索引碎片——这是件好事)

在这种情况下,您可以创建一个连接实体,该实体同时引用一个特定的汽车和一个特定的人。基本上,您将多对多关联视为两个一对多关联的组合:

public class PersonToCar
{
   public int PersonToCarId { get; set; }
   public int CarId { get; set; }
   public virtual Car Car { get; set; }
   public int PersonId { get; set; }
   public virtual Person Person { get; set; }
   public DateTime ValidFrom { get; set; }
}

public class Person
{
  public int PersonId { get; set; }
  public string Name { get; set; }
  public virtual ICollection<PersonToCar> CarOwnerShips { get; set; }
}

public class Car
{
  public int CarId { get; set; }
  public string LicensePlate { get; set; }        
  public virtual ICollection<PersonToCar> Ownerships { get; set; }
}

public class MyDemoContext : DbContext
{
  public DbSet<Person> People { get; set; }
  public DbSet<Car> Cars { get; set; }
  public DbSet<PersonToCar> PersonToCars { get; set; }
}
public class PersonToCar
{
公共int PersonToCarId{get;set;}
public int CarId{get;set;}
公共虚拟汽车{get;set;}
公共int PersonId{get;set;}
公共虚拟人{get;set;}
public DateTime ValidFrom{get;set;}
}
公共阶层人士
{
公共int PersonId{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection汽车所有权{get;set;}
}
公车
{
public int CarId{get;set;}
公共字符串许可证牌{get;set;}
公共虚拟ICollection所有权{get;set;}
}
公共类MyDemoContext:DbContext
{
公共数据库集人物{get;set;}
公共数据库集车辆{get;set;}
公共数据库集PersonToCars{get;set;}
}
这给了我更多的控制权和灵活性。我现在可以将自定义数据添加到关联中,每个关联都有自己的主键,因此我可以更新其中的汽车或车主引用

请注意,这实际上只是两个一对多关系的组合,因此您可以使用前面示例中讨论的所有配置选项。

此外,您必须在模型中映射连接类,因为它包含的信息不仅仅是两个外键。
public class Medicine
{
    public Medicine()
    {
        this.Diseases = new HashSet<App.Models.Disease.Disease>();
    }

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public Int32 MedicineID { get; set; }

    [Required]
    [StringLength(100)]
    [Display(Name = "Generic Name")]
    public string Medicine_Generic_Name { get; set; }

    [Required]
    [StringLength(100)]
    [Display(Name = "Trade Name")]
    public string Medicine_Trade_Name { get; set; }

    [Required]
    [StringLength(15)]
    [Display(Name = "Availability")]
    public string Medicine_Availability { get; set; }

    [Required]
    [Display(Name = "No.of times free")]
    public Int32 Medicine_TimesFree { get; set; }

    public virtual ICollection<App.Models.Disease.Disease> Diseases { get; set; }

}
public class PersonToCar
{
   public int PersonToCarId { get; set; }
   public int CarId { get; set; }
   public virtual Car Car { get; set; }
   public int PersonId { get; set; }
   public virtual Person Person { get; set; }
   public DateTime ValidFrom { get; set; }
}

public class Person
{
  public int PersonId { get; set; }
  public string Name { get; set; }
  public virtual ICollection<PersonToCar> CarOwnerShips { get; set; }
}

public class Car
{
  public int CarId { get; set; }
  public string LicensePlate { get; set; }        
  public virtual ICollection<PersonToCar> Ownerships { get; set; }
}

public class MyDemoContext : DbContext
{
  public DbSet<Person> People { get; set; }
  public DbSet<Car> Cars { get; set; }
  public DbSet<PersonToCar> PersonToCars { get; set; }
}