22 votos

¿Cómo puedo adjuntar una Entidad Marco de objeto que no es de la base de datos?

Tengo una separación completa de mi Entity Framework objetos y mi POCO los objetos, acabo de traducir de ida y vuelta...

yo.e:

// poco
public class Author
{
   public Guid Id { get; set; }
   public string UserName { get; set; }
}

y luego tengo un EF objeto de "Autores" con las mismas propiedades..

Así que tengo mi negocio objeto

var author = new Author { UserName="foo", Id="Guid thats in the db" };

y quiero guardar este objeto para que yo haga 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 null EntityKey valor no puede ser asociado a un objeto contexto.

EDITAR: Parece que tengo uso de entidades.AttachTo("Autores", dbAuthor); sin adjuntar un EntityKey, pero luego me han codificado cadenas mágicas, que se romperá si puedo cambiar mi entidad establecer los nombres a todos y ya no quiero tener ninguna comprobación en tiempo de compilación... hay una manera que puedo adjuntar la que mantiene el tiempo de compilación de la comprobación?

Espero que me gustaría ser capaz de hacer esto, como codificado cadenas de matar el tiempo de compilación de validación aspiraría =)

15voto

Alex James Puntos 15939

Acabo de ver esto ahora. Si desea conectar() a ObjectContext, es decir, convencer a la entidad marco que existe una entidad en la base de datos ya, y desea evitar el uso de cadenas mágicas es decir,

ctx.AttachTo("EntitySet", entity);

Usted puede tratar de dos posibilidades basadas en los métodos de extensión, tanto de lo que sin duda hacen la vida más llevadera.

La primera opción permite escribir:

ctx.AttachToDefault(entity);

y está cubierto de aquí: Consejo 13 - Cómo adjuntar una entidad de la manera más fácil

La segunda opción permite escribir:

ctx.EntitySet.Attach(entity);

y está cubierto aquí: Consejo 16 - Cómo imitar .NET 4.0 ObjectSet hoy

Como usted puede ver que ambos son realmente fáciles de usar y evitar las cadenas por completo.

Espero que esto ayude

Alex

13voto

Quintin Robinson Puntos 41988

Has probado a utilizar AttachTo y la especificación de la entidad?..

entities.AttachTo("Authors", dbAuthor);

donde "Authors" sería su real entidad nombre de set.

Editar:
Sí que hay una mejor manera (así debería ser). El diseñador debe de haber generado "Agregar" métodos para la ObjectContext para usted, que se traduce a la llamada anterior.. Así que usted debe ser capaz de hacer:

entities.AddToAuthors(dbAuthor);

que debe ser literalmente:

public void AddToAuthors(Authors authors)
{
    base.AddObject("Authors", authors);
}

se define en el whateverobjectcontext.el diseñador.cs archivo.

5voto

sebagomez Puntos 3305

Pruebe esta opción si no desea escribir la cadena de caracteres con el nombre de EntitySet

entities.AttachTo(entities.CreateObjectSet<T>().EntitySet.Name, entity);

4voto

una alternativa a esto es la siguiente, en particular, si usted no sabe cuál es la entidad que se va a operar en:

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

0voto

Roman O Puntos 312

Puedes probar las siguientes

entities.AddToAuthors(dbAuthor);

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X