update referencia reciente proyecto modified mas maestro hacer hace framework entitystate ejemplo editar detalle datos con actualizar entity-framework-4 foreign-key-relationship

entity framework 4 - referencia - La propiedad ''Id'' es parte de la información clave del objeto y no se puede modificar



maestro detalle entity framework (12)

En mi caso, estaba creando un objeto declarado e inicializado juntos. Acabo de inicializar en el constructor o lo que puede inicializar el objeto cuando sea necesario.

Estoy usando Entity Framework 4.0 y tengo un problema tonto que no puedo resolver.

Tengo dos mesas:

  1. Contacto: Id (clave principal), Valor, ContactTypeId (clave externa a ContactType)
  2. Tipo de contacto: ID (clave principal), Tipo (Hogar, Celular, Trabajo, etc.)

Entity Framework creó las siguientes dos entidades:

  1. Contacto: Id, Value, ContactType (propiedad de navegación)
  2. Tipo de contacto: ID, tipo, contacto (propiedad de navegación)

Estoy usando el siguiente código para obtener el contacto y actualizar el tipo de contacto para ese contacto en particular:

Contact contact = dbContext.Contacts.Single(c => c.Id == 12345); contact.ContactType.Id = 3;

Lanza la siguiente excepción:

The property ''Id'' is part of the object''s key information and cannot be modified.

¡Se ve tan simple! No lo entiendo


En mi caso, quiero duplicar el objeto, pero cambiar el ID, así que uso este

Common.DataContext.Detach(object);

Trabajar como un encanto


Este problema ocurre porque estás haciendo referencia al mismo objeto más de una vez. Esto no es una limitación de EF, sino una característica de seguridad para garantizar que no inserte el mismo objeto con dos ID diferentes. Entonces, para lograr lo que intenta hacer, simplemente cree un nuevo objeto y agregue el objeto recién creado a la base de datos.

** Este problema suele ocurrir dentro de los bucles. Si está utilizando un ciclo while o foreach, asegúrese de tener el nuevo objeto creado DENTRO del cuerpo del bucle.

prueba esto:

Contact contact = dbContext.Contacts.Single(c => c.contactTypeId == 1234); contact.contactTypeId = 4; dbContext.AddObject(contact); dbContext.SaveChanges();


Estoy usando EF 4.0 y WPF y tuve un problema similar, y ... encontré el problema que lo resolvió (al menos para mí) de una manera muy simple.

Porque, como usted, pensé que debía ser sencillo actualizar un campo en una tabla (es decir, en su caso: Contacto ) al que se hace referencia mediante una clave externa de otra tabla (es decir, en su caso: Tipo de contacto).

Sin embargo, el mensaje de error: ".... es parte de la información clave del objeto y no se puede modificar". solo aparece cuando intentas actualizar una clave principal (que no era mi intención en absoluto).

Eché un vistazo más de cerca al código XML de mi EntityModel y lo encontré:

<EntityType Name="Contact"> <Key> <PropertyRef Name="ID" /> <PropertyRef Name="contactTypeID" /> <!-- This second line caused my problem --> </Key> <Property Name="ID" Type="int" Nullable="false" /> ... ... </EntityType>

Por alguna razón (tal vez cometí un error tonto en mi base de datos), cuando Visual Studio generó automáticamente para mí el DataModel de mi base de datos, se agregó en esa misma tabla ( Contacto ), donde quise actualizar el campo ( ContactTypeID ) un segundo PropertyRef ( segunda línea ).

Acabo de borrar ese segundo PropertyRef :

<PropertyRef Name="contactTypeID" />

en ambos, el modelo de la tienda y el modelo conceptual y ... se resolvió el problema :-)

Por lo tanto, queda como:

<EntityType Name="Contact"> <Key> <PropertyRef Name="ID" /> </Key> <Property Name="ID" Type="int" Nullable="false" /> ... ... </EntityType>

Las actualizaciones y las inserciones ahora funcionan sin problemas como un bebé ... :-)

Por lo tanto, es una buena idea verificar el XML del modelo de datos para verificar que solo su PK esté listado como PropertyRef . Trabajó para mi ... :-)


Hay dos tipos de asociaciones. Asociación independiente donde la clave relacionada solo aparecerá como propiedad de navegación. El segundo es la asociación de clave externa donde la clave relacionada se puede cambiar usando clave externa y propiedad de navegación. Así que puedes hacer lo siguiente.

// opción 1 opción genérica

var contacttype = new ContactType{Id = 3}; db.ContactTypes.Attach(contacttype); customer.ContactType = contacttype;

Opción de clave externa opción 2

contact.ContactTypeId = 3;

// opción genérica funciona con clave externa y asociación independiente

contact.ContactReference.EntityKey = new EntityKey("container.contactset","contacttypeid",3);


La entidad creada por el marco no tiene una propiedad contact.ContactTypeId. Lo eliminó automáticamente y creó la asociación ContactType dentro de la entidad Contact.

La forma de hacer que funcione, como sugirió, es crear un objeto ContactType consultando la base de datos y asignándola a contact.ContactType. Por ejemplo:

Contact contact = dbContext.Contacts.Single(c => c.Id == 12345); ContactType contactType = dbContext.ContactType.Single(c => c.Id == 3); contact.ContactType = contactType;


Otro comportamiento extraño en mi caso es que tengo una tabla sin ninguna clave primaria. EF en sí crea una clave primaria compuesta usando todas las columnas, es decir:

<Key> <PropertyRef Name="ID" /> <PropertyRef Name="No" /> <PropertyRef Name="Code" /> </Key>

Y cada vez que hago una operación de actualización lanza esta excepción:

La propiedad ''Código'' es parte de la información clave del objeto y no se puede modificar.

Solución: quite la tabla del diagrama de EF y vaya a su DB. Agregue la clave principal en la tabla que está creando el problema y vuelva a agregar la tabla al diagrama de EF. Ahora todo tendrá una sola clave, es decir

<Key> <PropertyRef Name="ID" /> </Key>


Solo espero que esto ayude a alguien más, después de luchar durante horas con esto porque sabía que no estaba actualizando el PK y definitivamente tuve un PK. Tuve el valor PK enlazado a una barra de menú para mostrar el valor PK actual y esto estaba causando el problema.


Tenía esto sucediendo cuando editaba objetos relacionados de dos contextos separados al mismo tiempo. Ejemplo:

DataContext ctxA = new DataContext(); DataContext ctxB = new DataContext(); Author orwell = new Author {Name = "George Orwell" }; ctxA.Add(orwell); ctxB.Add(new Book {Name = "1984", Author = orwell}); ctxA.SaveChanges(); ctxB.SaveChanges();

Mi caso fue un poco más complicado (ya que esto obviamente es bastante estúpido) pero en esencia esto causó el error en mi caso.


Tratar

contact.ContactType = differentContactType;

o

contact.ContactTypeId = 3;

Está intentando establecer la ID del ContactType (del contacto) en 3.


en mi caso, simplemente puse la clave principal en la tabla que faltaba, volví a hacer el mappind edmx y funcionó cuando tienes la clave principal, solo tendría esto

<PropertyRef Name="id" />

sin embargo, si la clave principal no está configurada, tendrías

<PropertyRef Name="id" /> <PropertyRef Name="col1" /> <PropertyRef Name="col2" />

tenga en cuenta que la respuesta de Juergen Fink es una solución


primero Eliminar siguiente agregar

para simple

public static IEnumerable UserIntakeFoodEdit(FoodIntaked data) { DBContext db = new DBContext(); var q = db.User_Food_UserIntakeFood.AsQueryable(); var item = q.Where(f => f.PersonID == data.PersonID) .Where(f => f.DateOfIntake == data.DateOfIntake) .Where(f => f.MealTimeID == data.MealTimeIDOld) .Where(f => f.NDB_No == data.NDB_No).FirstOrDefault(); item.Amount = (decimal)data.Amount; item.WeightSeq = data.WeightSeq.ToString(); item.TotalAmount = (decimal)data.TotalAmount; db.User_Food_UserIntakeFood.Remove(item); db.SaveChanges(); item.MealTimeID = data.MealTimeID;//is key db.User_Food_UserIntakeFood.Add(item); db.SaveChanges(); return "Edit"; }