gpt4 book ai didi

c# - 更新在 linq to sql 中具有子实体的断开连接的实体

转载 作者:太空狗 更新时间:2023-10-29 23:39:53 25 4
gpt4 key购买 nike

在 n 层应用程序中,linq-to-sql 似乎没有明确的解决方案来更新具有子 EntitySet 的断开连接的实体。

我有一些 linq-to-sql 实体...

public partial class Location : INotifyPropertyChanging, INotifyPropertyChanged
{
public int id;
public System.Nullable<int> idLocation;
public string brandingName;
public System.Data.Linq.Binary timeStamp;
public EntitySet<LocationZipCode> LocationZipCodes;
}

public partial class LocationZipCode : INotifyPropertyChanging, INotifyPropertyChanged
{
public string zipcode;
public string state;
public int idLocationDetail;
public int id;
public System.Data.Linq.Binary timeStamp;
public EntityRef<Location> Location;
}

所以一个Location实体将有一个 EntitySetLocationZipCodes .

Location域模型被映射到表示层使用的 View 模型,然后最终将更改后的 View 模型实体发回,并映射回 Location。域模型。从那里我更新实体并保存更改。这是处理程序:

public class ProgramZipCodeManagerHandler : IHttpHandler {
private LocationsZipCodeUnitOfWork _locationsZipCodeUnitOfWork = new LocationsZipCodeUnitOfWork();

public void ProcessRequest(HttpContext context) {
if (context.Request.HttpMethod == "POST") {
string json = Json.getFromInputStream(context.Request.InputStream);

if (!string.IsNullOrEmpty(json)) {
Location newLocation = Json.deserialize<Location>(json);
if (newLocation != null) {
//this maps the location view model from the client to the location domain model
var newDomainLocation = new Mapper<Location, DomainLocation>(new DomainLocationMapTemplate()).map(newLocation);

if (newDomainLocation.id == 0)
_locationsZipCodeUnitOfWork.locationRepository.insert(newDomainLocation);
else
_locationsZipCodeUnitOfWork.locationRepository.update(newDomainLocation);

_locationsZipCodeUnitOfWork.saveChanges(ConflictMode.ContinueOnConflict);

var viewModel = new Mapper<DomainLocation, Location>(new LocationMapTemplate()).map(newDomainLocation);
context.Response.ContentType = "application/json";
context.Response.Write(Json.serialize(viewModel);
}
}
}
}
}

这是我的 locationRepository 中的更新方法:

protected System.Data.Linq.Table<T> _table;

public void update(T entity) {
_table.Attach(entity, true);
_context.Refresh(RefreshMode.KeepCurrentValues, entity);
}

public void update(T newEntity, T oldEntity) {
_table.Attach(newEntity, oldEntity);
_context.Refresh(RefreshMode.KeepCurrentValues, newEntity);
}

我可以看到所有与Location 直接关联的记录实体正在更新,但子集合 ( public EntitySet<LocationZipCode> LocationZipCodes) 未更新。

是否有一种明确的方法来更新具有也需要更新的子 EntitySet 的断开连接的实体?换句话说,我有一个分离的实体,其中包含另一个实体的集合。该集合已更改,我需要在数据库中更新它。

最佳答案

不..你不能那样做。

附加和分离对象是根据您使用的对象进行的,不会影响相关对象(实体)。

您可以从这里阅读更多信息:
Attaching and Detaching Objects

考虑这样一种情况,其中对象 A 与包含 1000 个值的集合 B 相关。您分离 A 并将其发送到某个远程处理 - A 在 B 关系中发送 null .. 现在 A 被带回您的程序 - 无法知道 A.B null 是远程处理的结果还是它已经用 null 给了远程处理。

在与此答案一起发布的链接中 - 请向下滚动以仔细阅读标题为:
的部分 分离对象的注意事项。

关于c# - 更新在 linq to sql 中具有子实体的断开连接的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15503827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com