5

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エンティティにはEntitySetof がありLocationZipCodesます。

ドメイン モデルはLocation、プレゼンテーション レイヤーが使用するビュー モデルにマップされ、最終的に変更されたビュー モデル エンティティが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);
                }
            }
        }       
    }
}

my 内の update メソッドは次の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 を持つ切断されたエンティティを更新する明確な方法はありますか? つまり、別のエンティティのコレクションを持つ切り離されたエンティティがあります。そのコレクションが変更されたため、データベースで更新する必要があります。

4

2 に答える 2

2

いいえ..それはできません。

オブジェクトのアタッチとデタッチは、操作するオブジェクトごとに行われ、関連するオブジェクト (エンティティ) には影響しません。

ここから詳細情報を読むことができます:
オブジェクトのアタッチとデタッチ

オブジェクト A が、1000 個の値で満たされたコレクション B に関連付けられている状況を考えてみましょう。A をデタッチし、リモート処理に送信します。A は B リレーションで null とともに送信されます。そして、A がプログラムに戻されます。AB null がリモート処理の結果であるか、リモート処理であったかを知る方法はありません。既に null でリモート処理に与えられています。

この回答とともに投稿されたリンクで、下にスクロールして、「
オブジェクトの切り離しに関する考慮事項」というタイトルのセクションを注意深く読んでください。

于 2013-03-28T06:39:11.093 に答える