修改一对多关系 - 代码首先
-
26-10-2019 - |
题
我认为以下任务似乎很容易编码,但是我花了很多时间,但尚未找到正确解决它的方法。这是场景
我有三个实体城市,地方和捐助者。城市有许多地方,每个地方与捐助者有两对一对一的关系,如下所示。
public class City {
public virtual List<Locality> Localities { get; set; }
}
public class Locality {
public virtual List<Donor> DonorsInOfficeLocality { get; set; }
public virtual List<Donor> DonorsInResidenceLocality { get; set; }
}
public class Donor : User {
public virtual Locality OfficeLocality {get;set;}
public virtual Locality ResidenceLocality { get; set; }
}
在我的捐助者编辑模块中,我收到的(捐赠者ID,居住区和OfficeLocalityID)。捐助者实体处于从演示层开始的独立状态。此代码不起作用。旧的关系保持完整。
public void EditDonor(Donor donor, int residenceLocalityId, int officeLocalityId) {
Locality residenceLocality = context.Localities.Find(residenceLocalityId);
donor.ResidenceLocality = residenceLocality;
Locality officeLocality = context.Localities.Find(officeLocalityId);
donor.OfficeLocality = officeLocality;
context.Donors.Attach(donor);
context.Entry(donor).State = EntityState.Modified;
context.SaveChanges();
}
我尝试的另一件事是更改居住的状态和正式性的修改,但这也不起作用。古老的关系保持完整。在这种情况下,由于我将其更改为修改后的地方,因此我必须额外加载城市,以避免修改后的地方更新例外。
如果有人可以让我知道如何将一个从演示层收到的独立状态中的实体修改为多个关系(如上所述)。
解决方案
您可以将导航属性和外键都保留在模型中。
public class Locality {
public int Id{get;set;}
public virtual List<Donor> DonorsInOfficeLocality { get; set; }
public virtual List<Donor> DonorsInResidenceLocality { get; set; }
}
public class Donor : User {
public virtual Locality OfficeLocality {get;set;}
public int OfficeLocalityId{get;set;}
public virtual Locality ResidenceLocality { get; set; }
public int ResidenceLocalityId{get;set;}
}
如果您有外国密钥属性,则无需通过ID查找即可更新导航属性,
public void EditDonor(Donor donor, int residenceLocalityId, int officeLocalityId) {
donner.OfficeLocalityId=officeLocalityId;
donor.ResidenceLocalityId=residenceLocalityId;
context.Donors.Attach(donor);
context.Entry(donor).State = EntityState.Modified;
context.SaveChanges();
}
不隶属于 StackOverflow