私は次のデザインを使用しています:
ドメイン/DTO 変換 (両方の方法)、Entity Framework Code First、および SQL Server 2012 に AutoMapper を使用しています。
各テーブルには、更新をチェックするためにRowVersion
type という名前のフィールドがあります。timestamp
ドメイン オブジェクトを WCF サービスでシリアル化できないため、DTO レイヤーを使用しており、ドメイン レイヤーにサイクルがあります。
とにかく、私の問題は、Bank
(UI に 1 つのページを持つ 1 つのテーブル) を作成するときに、値 (BankCode、BankName) をコピーBankDTO
し、サービス層で AutoMapper を使用して (のエンティティ ドメイン オブジェクト) に変換BankDTO
してからBankDomain
呼び出すBank
ことです。SaveChange
.
それは機能し、銀行も更新できます。
しかし、1 つとBank
銀行の支店を編集してから、 BankDTO
TOに変換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; }
}
そしてBankBranch
DTO:
[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();
を使用する代わりにBankDto
andBankBranchDto
をBankDomain
andにマップすると機能しますが、AutoMapper を使用する必要があります。BankBranchDomain
Mapper.Map
SaveChanges