2009-10-02 15 views
11

Estoy reescribiendo mi aplicación para usar el marco de entidad. Lo que estoy confundido es que el código que estoy escribiendo parece que está haciendo tripts innecesarios el servidor sql. Por ejemplo, tengo un sitio de preguntas y respuestas similar a SO. Cuando agrego una respuesta a una pregunta - aquí está el código que utilizo:¿Por qué el marco de la entidad hace tantas vueltas a la base de datos?

var qu = context.question.where(c => c.questionID == 11).First(); //Database call here 
var answer = new answer(); 
answer.title = "title here"; 
answer.desc = "desc here"; 
answer.question = qu; 
context.SaveChanges(); //Database call here 

En el código anterior, hay 2 bases de datos llama verdad? Si es así, ¿por qué no puedo agregar una respuesta a una pregunta directamente? como

var ans = answer.Createanswer (0, "title here", "desc here", questionID) 
context.SaveChanges(); 

¿Hay alguna forma de minimizar todas las llamadas a la base de datos?

+1

Buena pregunta ... –

Respuesta

11

Según lo explicado por AlexJ uno de los diseñadores de EF http://blogs.msdn.com/alexj/archive/2009/06/19/tip-26-how-to-avoid-database-queries-using-stub-entities.aspx

también todo esto cae dentro del reino de "optimización", que en no muy a menudo tan simple como parece

Utilizando el enfoque sencillo SQL ejecutará una operación de lectura para cargar el FK (pregunta) y guardará el resultado en caché, y luego en un comando separado una operación de inserción que debería estar usando el resultado FK guardado en caché

Usando el método FK adjunto todavía resulta en servidor haciendo una operación de lectura para el FK, solo significa un viaje redondo menos al servidor SQL. Entonces, la pregunta es: con el tiempo, ¿es un viaje redondo más costoso que el aumento de la complejidad del código?

Si la aplicación y SQL Server se encuentran en la misma máquina esta sobrecarga es muy pequeño

Además, si el FK es un índice agrupado en una mesa grande o amplia la sobrecarga IO puede ser significativamente mayor que si se trata de un índice estándar independiente en sólo el valor FK - suponiendo que el optimizador de consultas está funcionando correctamente :-)

-3

Se puede hacer, pero es extremadamente doloroso en .NET 3.5. Lo han hecho mucho más fácil en .NET 4.0.

8

No necesita cargar la Pregunta para establecer la relación. En su lugar, puede usar EntityReference

, por ejemplo,

Answer.QuestionReference = new EntityReference<Question>(); 
Answer.QuestionReference.EntityKey 
    = new EntityKey("MyContextName.Question", "Id", questionId); 

Yo personalmente uso un método de extensión para el establecimiento de claves de entidad

public static void SetEntityKey<T>(this EntityReference value, int id) 
{ 
    value.EntityKey = new EntityKey("ContextName." + typeof(T).Name, "Id", id); 
} 

Así se vería como esto en su lugar.

Answer.QuestionReference = new EntityReference<Question>(); 
Answer.QuestionReference.SetEntityKey<Question>(questionId); 
+0

no se puede utilizar 'esta EntityReference ' para evitar la explícita al llamar SetEntityKey? – devio

Cuestiones relacionadas