c# - que - entity framework vb net
¿Cómo puedo adjuntar un objeto de Entity Framework que no sea de la base de datos? (6)
Tengo una separación completa de mis objetos Entity Framework y mis objetos POCO, simplemente los traduzco de un lado a otro ...
es decir:
// poco
public class Author
{
public Guid Id { get; set; }
public string UserName { get; set; }
}
y luego tengo un objeto EF "Autores" con las mismas propiedades ...
Así que tengo mi objeto de negocio
var author = new Author { UserName="foo", Id="Guid thats in the db" };
y quiero guardar este objeto por lo que hago lo siguiente:
var dbAuthor = new dbAuthor { Id=author.Id, UserName=author.UserName };
entities.Attach(dbAuthor);
entities.SaveChanges();
Pero esto me da el siguiente error:
Un objeto con un valor EntityKey nulo no se puede adjuntar a un contexto de objeto.
EDIT: Parece que tengo que usar entes.AttachTo ("Autores", dbAuthor); para adjuntar sin una EntityKey, pero luego tengo cadenas mágicas codificadas, que se romperán si cambio mi nombre de conjunto de entidades y no tendré ninguna verificación de tiempo de compilación ... ¿Hay alguna manera de adjuntar que mantenga la verificación de tiempo de compilación ?
Espero poder hacer esto, ya que las cadenas codificadas que eliminan la validación del tiempo de compilación apestarían =)
¿Ha intentado usar AttachTo y la especificación del conjunto de entidades? ..
entities.AttachTo("Authors", dbAuthor);
donde "Authors"
sería su nombre de conjunto de entidades real.
Editar:
Sí, hay una mejor manera (bueno debería haber). El diseñador debería haber generado los métodos "Agregar" al ObjectContext para usted, que se traducen en la llamada anterior. Así que debería poder hacer:
entities.AddToAuthors(dbAuthor);
que debería ser literalmente:
public void AddToAuthors(Authors authors)
{
base.AddObject("Authors", authors);
}
definido en el archivo whateverobjectcontext.designer.cs.
Intente esto si no desea escribir la cadena con el nombre EntitySet
entities.AttachTo(entities.CreateObjectSet<T>().EntitySet.Name, entity);
Para mi,
Context.Authors.AddObject(new Author())
funciona perfectamente. ¿Se pregunta si me estoy perdiendo algo? ¿O no es el camino correcto?
Puedes intentar seguir
entities.AddToAuthors(dbAuthor);
Solo viendo esto ahora. Si desea Adjuntar () al ObjectContext, es decir, convencer al marco de la entidad de que ya existe una entidad en la base de datos y desea evitar el uso de cadenas mágicas, es decir
ctx.AttachTo("EntitySet", entity);
Puedes probar dos posibilidades basadas en métodos de extensión, los cuales sin duda hacen que la vida sea más llevadera.
La primera opción te permite escribir:
ctx.AttachToDefault(entity);
y se trata aquí: Consejo 13 - Cómo adjuntar una entidad de manera fácil
La segunda opción te permite escribir:
ctx.EntitySet.Attach(entity);
y se trata aquí: Consejo 16 - Cómo imitar el ObjectSet de .NET 4.0 hoy
Como puede ver, ambos son realmente fáciles de usar y evitan las cadenas por completo.
Espero que esto ayude
Alex
una alternativa a esto es la siguiente, en particular, si no sabe en qué entidad operará:
string className = entityObject.GetType().Name;
var container = _DbContext.MetadataWorkspace.GetEntityContainer(_DbContext.DefaultContainerName, DataSpace.CSpace);
string setName = (from meta in container.BaseEntitySets
where meta.ElementType.Name == className
select meta.Name).First();
_DbContext.AttachTo(setName, entityObject);