gpt4 book ai didi

c# - Entity Framework 无法保存我的更改

转载 作者:行者123 更新时间:2023-11-30 20:58:32 25 4
gpt4 key购买 nike

我正在使用以下设计:

System architecture

我使用 AutoMapper 进行域/DTO 转换(双向)、Entity Framework Code First 和 SQL Server 2012。

每个表都有一个名为RowVersiontimestamp 字段,用于检查更新。

我正在使用 DTO 层,因为我的域对象无法在 WCF 服务中序列化,而且我的域层中有一个循环。

无论如何,我的问题是,当创建一个 Bank(UI 中只有一个页面的一个表)时,我将值(BankCode、BankName)复制到 BankDTO 中,然后在我的服务层中,我使用 AutoMapper 将 BankDTO 转换为 BankDomain(Bank 的实体域对象),然后调用 SaveChange.

行得通,我也可以更新银行。

但是当我编辑一个 Bank 和一个银行分行时,然后将 BankDTO 转换为 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; }

}

银行域名:

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();

如果我在 BankDomainBankBranchDomain 中映射 BankDtoBankBranchDto 而不是使用 Mapper.Map ,然后 SaveChanges 工作 - 但我必须使用 AutoMapper。

最佳答案

您需要先添加已更改的对象或值,然后保存更改。

  db.Banks.AddObject(---your object name or value which you want to add---);
db.SaveChanges();

关于c# - Entity Framework 无法保存我的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16029946/

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