C# C实体更新表失败

C# C实体更新表失败,c#,sql,entity-framework,linq,composite-primary-key,C#,Sql,Entity Framework,Linq,Composite Primary Key,我有一个具有组合主键的表,如下所示。我正在尝试使用MVC添加/更新/删除功能。添加和删除工作正常,但更新EffectiveDate列失败,因为存在多个具有相同ClientName和公文包的行。下表提供了结构和实体/服务代码。你能看看我在代码中遗漏了什么吗 运行时错误: 受意外事件影响的存储更新、插入或删除语句 行数为0。实体可能已被修改或删除,因为 实体已加载。看见 有关 理解和处理乐观并发异常 实体代码 //视图模型 public class RiskReportDataViewModel {

我有一个具有组合主键的表,如下所示。我正在尝试使用MVC添加/更新/删除功能。添加和删除工作正常,但更新EffectiveDate列失败,因为存在多个具有相同ClientName和公文包的行。下表提供了结构和实体/服务代码。你能看看我在代码中遗漏了什么吗

运行时错误:

受意外事件影响的存储更新、插入或删除语句 行数为0。实体可能已被修改或删除,因为 实体已加载。看见 有关 理解和处理乐观并发异常

实体代码

//视图模型

public class RiskReportDataViewModel
{

    [Key]
    public virtual string Client { get; set; }

    [Key]
    [StringLength(500)]
    public virtual string Portfolio { get; set; }

    public virtual decimal AUM { get; set; }

    [Key]
    public virtual DateTime EffectiveDate { get; set; }

    public virtual String IsStatic { get; set; }

    public virtual DateTime sysDate { get; set; }

    [StringLength(500)]
    public virtual string ModifiedBy { get; set; }

}

我认为您使用RiskReportDataViewModel进行了更新,您是否使用Custom进行了更新? 告诉我更新的方法

实际上,您需要先选择从数据库获取自定义,然后更改自定义和保存的值

为什么自定义模型中有三个键,如下所示

public class Custom
{

[Key]
[Column(Order = 1)]
public virtual string Client { get; set; }

[Key]
[Column(Order = 2)]
public virtual string Portfolio { get; set; }

[Required]
public virtual decimal AUM { get; set; }

[Key]
[Column(Order = 3)]
public DateTime EffectiveDate { get; set; }

[StringLength(50)]
[Column(TypeName = "char")]
public string IsStatic { get; set; }

[Required]
public DateTime sysDate { get; set; }

[StringLength(500)]
public virtual string ModifiedBy { get; set; }

}

为键添加一个整数值。

此问题的解决方案是添加一个新行作为ID,并生成一个复合主键。感谢俊安分享想法。修改后的代码如下所示-

数据库表

服务代码


错误是什么?我更新了运行时错误。我认为这意味着无法在DB中保存任何行。-谢谢。我已经提供了CustomAUM_更新方法代码。我还试着取下两把钥匙。我认为这个表有复合主键,所以我想使用三个键。当我删除两个键时,这就是我得到的错误。违反主键约束“PK_CustomAUM”。无法在对象“dbo.CustomAUM”中插入重复键。重复的键值为2017年1月2日12:00时在STEVENS,Verition的L/Sbmu。该语句已终止。服务代码随CustomAUM_更新方法的更新代码一起提供。-谢谢。哦,现在我可以看到了,你用的是哪个ef版本?对我来说,我用的是ef核心。所以看起来有点不同。但首先使用键选择自定义行并更改值,然后保存更改;这是如何更新VAR custom=riskContext.custom.FirstOrDefaultx=>x.key==key的逻辑;像这样的事。。。但是您的代码只是创建了一个新的自定义类。。它应该从上下文中获取模型
public void CustomAUM_Update(RiskReportDataViewModel riskReportDataViewModel, string userName)
    {
            var entity = new Custom();

            entity.Client = riskReportDataViewModel.Client;
            entity.Portfolio = riskReportDataViewModel.Portfolio;
            entity.AUM = riskReportDataViewModel.AUM;
            entity.EffectiveDate = DateTime.Parse(riskReportDataViewModel.EffectiveDate.ToShortDateString());
            entity.IsStatic = riskReportDataViewModel.IsStatic;
            entity.sysDate = DateTime.Now;
            entity.ModifiedBy = userName;

            riskContext.Custom.Attach(entity);
            riskContext.Entry(entity).State = EntityState.Modified;
            riskContext.SaveChanges();
    }
public class RiskReportDataViewModel
{

    [Key]
    public virtual string Client { get; set; }

    [Key]
    [StringLength(500)]
    public virtual string Portfolio { get; set; }

    public virtual decimal AUM { get; set; }

    [Key]
    public virtual DateTime EffectiveDate { get; set; }

    public virtual String IsStatic { get; set; }

    public virtual DateTime sysDate { get; set; }

    [StringLength(500)]
    public virtual string ModifiedBy { get; set; }

}
public class Custom
{

[Key]
[Column(Order = 1)]
public virtual string Client { get; set; }

[Key]
[Column(Order = 2)]
public virtual string Portfolio { get; set; }

[Required]
public virtual decimal AUM { get; set; }

[Key]
[Column(Order = 3)]
public DateTime EffectiveDate { get; set; }

[StringLength(50)]
[Column(TypeName = "char")]
public string IsStatic { get; set; }

[Required]
public DateTime sysDate { get; set; }

[StringLength(500)]
public virtual string ModifiedBy { get; set; }

}
CREATE TABLE [dbo].[CustomAUM](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Client] [varchar](80) NOT NULL,
    [Portfolio] [varchar](100) NOT NULL,
    [AUM] [numeric](30, 6) NOT NULL,
    [EffectiveDate] [datetime] NOT NULL,
    [IsStatic] [char](1) NULL,
    [sysDate] [datetime] NOT NULL,
    [ModifiedBy] [varchar](80) NOT NULL,
 CONSTRAINT [PK_CustomAUM_New] PRIMARY KEY CLUSTERED 
(
    [ID] ASC,
    [Portfolio] ASC,
    [Client] ASC,
    [EffectiveDate] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
public void CustomAUM_Update(RiskReportDataViewModel riskReportDataViewModel, string userName)
        {
                var entity = new CustomAUM();

                entity = riskContext.CustomAUM.FirstOrDefault(x => x.ID == riskReportDataViewModel.ID && x.Client == riskReportDataViewModel.Client && x.Portfolio == riskReportDataViewModel.Portfolio);

                entity.Client = riskReportDataViewModel.Client;
                entity.Portfolio = riskReportDataViewModel.Portfolio;
                entity.AUM = riskReportDataViewModel.AUM;
                entity.EffectiveDate = DateTime.Parse(riskReportDataViewModel.EffectiveDate.ToShortDateString());
                entity.IsStatic = riskReportDataViewModel.IsStatic;
                entity.sysDate = DateTime.Now;
                entity.ModifiedBy = userName;

                riskContext.CustomAUM.Attach(entity);
                riskContext.Entry(entity).State = EntityState.Modified;
                riskContext.SaveChanges();
        }