2

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

システムアーキテクチャー

ドメイン/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();

を使用する代わりにBankDtoandBankBranchDtoBankDomainandにマップすると機能しますが、AutoMapper を使用する必要があります。BankBranchDomainMapper.MapSaveChanges

4

2 に答える 2

2

最初に変更したオブジェクトまたは値を追加してから、変更を保存する必要があります。

  db.Banks.AddObject(---your object name or value which you want to add---);
   db.SaveChanges();
于 2013-04-16T06:17:58.150 に答える