Codice quadro di entità prima - impossibile inserire il tasto duplicato nell'oggetto 'dbo.t_cprovider'

StackOverflow https://stackoverflow.com//questions/9664378

Domanda

Ho qualche problema urgente che non riesco a trovare la risposta per il web.

Sto usando Codefirst EF 4.3.1 e ricevo un errore: Violation of PRIMARY KEY constraint 'PK_T_CRProviders'. Cannot insert duplicate key in object 'dbo.T_CRProviders'.

Il mio codice è:

Modelli:

public enum CRProviderEnums
{
    PE_Abcd = 0,
    PE_Efgh
}

[Table("T_CRProviders")]
public class CRProvider
{
    [Key]
    [Required]
    public int Enum { get; set; }
    [Required]
    public string Name { get; set; }
}

[Table("T_CRSupportedResources")]
public class CRSupportedResource
{
    [Key]
    public Guid SupportedResourceId { get; set; }
    [Required]
    public CRProvider Provider { get; set; }
}
.

dbcontext:

public class RSContext : DbContext
{
    public DbSet<CRProvider> CRProviders { get; set; }
    public DbSet<CRSupportedResource> CRSupportedResources { get; set; }
}
.

Tabella T_CRPROVIDERS Sembra questo: Enum (PK), Name

Tabella T_CRSUPPORTEDRESOURCES Sembra questo: SupportedResourceId (PK), Provider_Enum (FK).

Nella tabella del database T_Crproviders ho già un fornitore con i seguenti valori:

Enum: 0 (which is PE_Abcd)
Name: "PE_Abcd"
.

Ora il mio principale () chiama un metodo addsupportedresource. Questo metodo aggiunge alla tabella T_CRSupportedResources un nuovo CrsupportedResource che si riferisce al provider 0 (PE_ABCD). Il metodo sembra questo:

public void AddSupportedResource()
    {
        CRSupportedResource supportedResource = new CRSupportedResource()
        {
            SupportedResourceId = Guid.NewGuid(),
            Provider = new CRProvider()
            {
                Enum = (int)CRProviderEnums.PE_Abcd,
                Name = "PE_Abcd"
            }
        };

        using (RSContext myContext = new RSContext())
        {
            myContext.CRSupportedResources.Add(supportedResource);

            myContext.SaveChanges();
        }
    }
.

Mi aspetto che questo metodo lascerà intatto Table T_Crproviders e aggiungi una nuova riga alla tabella T_CRSupportedResources che sarà simile a questo:

SupportedResourceId: DE532083-68CF-484A-8D2B-606BC238AB61
Provider_Enum (FK): 0 (which is PE_Abcd).
.

Invece, su SaveChanges, Entity Framework cerca anche di aggiungere fornitore alla tabella T_Crproviders, e dal momento che un tale fornitore esiste già che lancia la seguente eccezione:

An error occurred while updating the entries.

Violation of PRIMARY KEY constraint 'PK_T_CRProviders'. Cannot insert duplicate key in object 'dbo.T_CRProviders'.

The statement has been terminated.
.

La mia domanda:

Come posso istruire l'EF non aggiornare la tabella T_CRProviders al momento dell'aggiornamento della tabella T_CRSupportedResources?

BTW, nel server SQL vedo che la tabella T_CRSupportedResources ha una chiave esterna denominata FK_RW_TCRSupportedCloudResources_RW_TCRCloudProviders_Provider_Enum e la sua regola di aggiornamento ha il valore di No Action.

È stato utile?

Soluzione 2

In realtà, c'è un modo per farlo.

Vedi la risposta alla mia domanda nel seguente link:

http://social.mssdn.microsoft.com/forums/en-us/adotnetictentyFramework/Thread/62F3E5BC-C972-4622-B830-E7D7FE710101

Altri suggerimenti

.

Mi aspetto che questo metodo lascerà intatto Table T_Crproviders, e aggiungi una nuova riga alla tabella T_CRSUPPORTEDRESOURCES

No non succederà.Stai creando un grafico di entità indipendente costituito dall'entità esistente A e una nuova entità.L'EF non sa sull'esistenza della tua entità finché non lo informi su di esso - non ci sono query DB che convalida l'esistenza eseguita da EF su dietro.

Se si chiama il metodo Add tutte le entità nel grafico dell'entità vengono aggiunte come nuove.Se non si desidera inserirli tutti, è possibile iniziare con l'utilizzo di Attach e cambiare manualmente uno stato per nuovi.Ad esempio come:

myContext.CRSupportedResources.Attach(supportedResource);
myContext.Entry(supportedResource).State = EntityState.Added;
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top