私は次のデザインを使用しています:

ドメイン/DTO 変換 (両方の方法)、Entity Framework Code First、および SQL Server 2012 に AutoMapper を使用しています。
各テーブルには、更新をチェックするためにRowVersiontype という名前のフィールドがあります。timestamp
ドメイン オブジェクトを WCF サービスでシリアル化できないため、DTO レイヤーを使用しており、ドメイン レイヤーにサイクルがあります。
とにかく、私の問題は、Bank(UI に 1 つのページを持つ 1 つのテーブル) を作成するときに、値 (BankCode、BankName) をコピーBankDTOし、サービス層で AutoMapper を使用して (のエンティティ ドメイン オブジェクト) に変換BankDTOしてからBankDomain呼び出すBankことです。SaveChange.
それは機能し、銀行も更新できます。
しかし、1 つとBank銀行の支店を編集してから、 BankDTOTOに変換BankDomainして を呼び出すとSaveChange、機能しません。AutoMapperなしでマップBankDTOすると、それが機能し、更新が実行されます。BankDomain
私BankDTOはこのように見えます:
[Serializable]
public class BankModel
{
public BankModel()
{
this.BankBranches = new List<BankBranchModel>();
}
public int? Id { get; set; }
public byte[] RowVersion { get; set; }
public decimal BankCode { get; set; }
public string BankName { get; set; }
public string LatinCode { get; set; }
public virtual ICollection<BankBranchModel> BankBranches { get; set; }
}
そしてBankBranchDTO:
[Serializable]
public class BankBranchModel
{
public BankBranchModel()
{
}
public int BankId { get; set; }
public decimal BranchCode { get; set; }
public string BranchName { get; set; }
public int? ExecutiveUnitId { get; set; }
public int? Id { get; set; }
public byte[] RowVersion { get; set; }
public BankModel Bank { get; set; }
}
BankDomain:
public class Bank : BaseEntity
{
public Bank()
{
this.BankBranches = new List<BankBranch>();
}
public decimal BankCode { get; set; }
public string BankName { get; set; }
public string LatinCode { get; set; }
public virtual ICollection<BankBranch> BankBranches { get; set; }
}
そしてBankBranchDomain:
public class BankBranch : BaseEntity
{
public BankBranch()
{
}
public int BankId { get; set; }
public decimal BranchCode { get; set; }
public string BranchName { get; set; }
public virtual Bank Bank { get; set; }
}
SQL テーブルは次のように作成されます。
CREATE TABLE [global].[Bank](
[Id] [int] NOT NULL,
[RowVersion] [timestamp] NOT NULL,
[BankCode] [numeric](18, 0) NOT NULL,
[BankName] [varchar](20) NOT NULL,
[LatinCode] [varchar](3) NOT NULL,
CONSTRAINT [PKBnk] PRIMARY KEY CLUSTERED
(
[Id] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [global].[BankBranch](
[Id] [int] NOT NULL,
[RowVersion] [timestamp] NOT NULL,
[BranchCode] [numeric](18, 0) NOT NULL,
[BranchName] [varchar](100) NOT NULL,
[BankId] [int] NOT NULL,
[ExecutiveUnitId] [int] NULL,
CONSTRAINT [PK_BankBranch] PRIMARY KEY CLUSTERED
(
[Id] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
そして更新コード:
using (var db = new AndishmandTestContext())
{
Mapper.CreateMap<BankModel, Bank>();
Mapper.CreateMap<Bank, BankModel>();
Mapper.CreateMap<BankBranchModel, BankBranch>();
Mapper.CreateMap<BankBranch, BankBranchModel>();
var oldb = db.Banks.Include("BankBranches").Where(b => b.Id == 1);
Bank bank = oldb.FirstOrDefault();
BankModel bankmodel = new BankModel();
Mapper.Map(bank, bankmodel);
}
UI レイヤーでを変更した後BankModel、このコードはサービス レイヤーで実行されます。
var Newb = db.Banks.Include("BankBranches").Where(b => b.Id == 1);
Bank newbank = Newb.FirstOrDefault();
Mapper.Map(bankmodel, newbank);
次に、変更がビジネスレイヤーに保存されます。
db.SaveChanges();
を使用する代わりにBankDtoandBankBranchDtoをBankDomainandにマップすると機能しますが、AutoMapper を使用する必要があります。BankBranchDomainMapper.MapSaveChanges