2017-01-24 5 views
0

Ich habe eine Tabelle mit einem zusammengesetzten Primärschlüssel wie unten angegeben. Ich versuche, Funktionalität mit C# MVC hinzuzufügen/zu aktualisieren/zu löschen. Hinzufügen und Löschen funktioniert gut, aber Update für EffectiveDate Die Spalte schlägt fehl, da mehrere Zeilen mit demselben Clientnamen und Portfolio vorhanden sind. Tabelle Struktur und Entity/Service-Code ist unten angegeben. Kannst du bitte einen Blick darauf werfen, was mir im Code fehlt?C# Entitätsaktualisierungstabelle fehlgeschlagen

Laufzeitfehler:

Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=472540 for information on understanding and handling optimistic concurrency exceptions.

CREATE TABLE [dbo].[CustomAUM](
[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] PRIMARY KEY CLUSTERED 
(
    [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] 

Entity-Code

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; } 

} 

public class CustomerMap : EntityTypeConfiguration<Custom> 
{ 
    public CustomerAUMMap() 
    { 
     //Primary Key 
     this.HasKey(k => new { k.Client, k.Portfolio, k.EffectiveDate }); 

     this.ToTable("CustomAUM"); 

     this.Property(x => x.Client).HasColumnName("Client"); 
     this.Property(x => x.Portfolio).HasColumnName("Portfolio"); 
     this.Property(x => x.AUM).HasColumnName("AUM"); 
     this.Property(x => x.EffectiveDate).HasColumnName("EffectiveDate"); 
     this.Property(x => x.IsStatic).HasColumnName("IsStatic"); 
     this.Property(x => x.sysDate).HasColumnName("sysDate"); 
     this.Property(x => x.ModifiedBy).HasColumnName("ModifiedBy"); 
    } 
} 

Service-Methode

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

// Ansicht Modell

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; } 

} 
+0

Was ist der Fehler? –

+0

Ich habe mit RunTime Error aktualisiert, die ich bekomme. Ich denke, es bedeutet nicht in der Lage, eine Zeile in DB zu speichern. - Vielen Dank. – Partha

Antwort

0

Lösung für dieses Problem besteht darin, eine neue Zeile als ID hinzuzufügen und einen zusammengesetzten Primärschlüssel zu erstellen. Danke an Jun An für den Austausch von Ideen. Modifizierten Code sieht wie folgt aus -

DB Tabelle

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] 

Service Code

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

Ich glaube, Sie mit RiskReportDataViewModel aktualisiert, haben Sie verwendet Gewohnheit zu aktualisieren? zeigen Sie mir die Methode für die Aktualisierung.

eigentlich müssen Sie wählen, um zuerst "Benutzerdefiniert" aus der Datenbank zu erhalten, dann die Werte von "Benutzerdefiniert" ändern und speichern.

und warum haben Sie drei Schlüssel in benutzerdefinierten Modell wie folgt?

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; } 

} 

fügen Sie einen der ganzzahligen Wert für Schlüssel hinzu.

+0

Ich habe den CustomAUM_Update-Methodencode bereitgestellt. Ich habe auch versucht, zwei Schlüssel zu entfernen. Ich denke, dass der Tisch einen zusammengesetzten Primärschlüssel hat, also dachte ich, dass ich drei Schlüssel verwenden sollte. Wenn ich zwei Schlüssel entferne, ist das der Fehler, den ich bekomme. Verletzung der PRIMARY KEY-Einschränkung "PK_CustomAUM". Kann doppelten Schlüssel in Objekt "Dbo.CustomAUM" nicht einfügen. Der doppelte Schlüsselwert ist (L/S_BMAT (STEVENS), Verition, 2. Januar 2017, 12:00 AM). Die Anweisung wurde beendet. – Partha

+0

zeigen Sie mir die Code-Methode der Aktualisierung –

+0

Service-Code ist mit aktualisierten Code der CustomAUM_Update-Methode zur Verfügung gestellt. - Vielen Dank. – Partha

Verwandte Themen