修改一对多关系 - 代码优先

时间:2011-09-05 12:16:19

标签: entity-framework entity-framework-4.1 ef-code-first code-first

我认为以下任务似乎很容易编码,但我花了很多时间,还没找到解决问题的正确方法。这是方案

我有三个实体城市,地区和捐助者。城市有很多地方,每个地方都有两个与捐赠者的一对多关系,如下所示。

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

在我的捐赠者编辑模块中,我收到(Donor Id,residenceLocalityId和officeLocalityId)。 Donor实体处于表示层的分离状态。此代码不起作用。旧的关系保持不变。

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

我尝试的另一件事是将ResidenceLocality和OfficeLocality的状态更改为Modified,但这也不起作用。旧关系保持不变。在这种情况下,由于我将Locality更改为Modified,我还需要另外加载City以避免修改后的位置的Update Exception。

如果有人可以让我知道如何修改从表示层接收的处于分离状态的实体的一对多关系(如上所述)。

1 个答案:

答案 0 :(得分:0)

您可以在模型中保留导航属性和外键。

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