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