none
Linq vs entidades RRS feed

  • Pregunta

  • Tengo el siguiente Codigo:

    Dim _dt as new GeneralEntities

    Dim query = From x in _dt.TblUsuarios Where x.UsuId = cint(Session("UsuId")) and x.UsuCla = "" Select x.UsuCla

    if query is nothing then

    ModelStat.AddModelError("","Error...")

    return View(model)

    endif

    Ahora segun los ejemplos tendria que hacer lo siguiente:

    query.UsuCla = "123456"

    _dt.SaveChanges()

    Pero no funciona y no interpreto el tipo de error.

    Aparentemente hay diferentes versiones de linq vs entidades y eso me ha llevado a la confusion. Estoy trabajando no con code first sino con un archivo "edmx" y una base de datos ya creada. Yo supongo que con "Select x.UsuCla" solo estoy seleccionado ese campo que es el que necesito editar. Si coloco query(0).UsuCla tampoco funciona. La confusion es grande...

    domingo, 4 de agosto de 2013 14:09

Todas las respuestas

  • hola

    pero que error estas recibiendo cuando ejecuta el linq ?

    porque algo que noto es que no puedes usar un CInt() cuando usas un edmx ya que la query linq se transforma a query sql, esto lo hace el framework y ese Cint no se puede convertir por eso falla

    quizas si usas

    Dim userid As Integer = cint(Session("UsuId"))

    Dim query = From x in _dt.TblUsuarios Where x.UsuId = userid and x.UsuCla = "" Select x.UsuCla

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 4 de agosto de 2013 14:14
  • Ya lo probé pues me parecio que era lo correcto pero no me da error ahi. Lo que no se como asginar el cambio, o sea asignar a la variable "query" el Nuevo valor de la clave: "123456"

    si coloco lo siguiente:

    si termino con "select x.UsuCla"

    no me permite poner query.usuclave = clave me dice que UsuCla no es miembro de ....

    si coloco query = clave me lo transforma en esto:

    query = CType(clave, Global.System.Linq.IQueryable(OfGlobal.MvcKnife.TblUsuario))

    y me da error

    domingo, 4 de agosto de 2013 14:29
  • El campo clave es string, pero supongo que la entidad transforma correctamente.

    En las lecturas que he realizado, e visto que la consulta se puede hacer (Dim query = ....).Single() o (Dim query = ....).First() pero nada me funciona.

    domingo, 4 de agosto de 2013 14:35
  • tienes que tomar solo un valor

    Dim query = _dt.TblUsuarios.FirstOrDefault(Function(x) x.UsuId = userid and x.UsuCla = "")

    If query IsNot Nothing Then

    query.UsuCla = "123456" _dt.SaveChanges()

    End If


    valida que la query retorne algun item con el cual trabajar, sino esta claro que el where que defines no coincde con ningun registro

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    domingo, 4 de agosto de 2013 14:40
  • asi tal cual lo hice y me da el siguiente error Leandro:

    Unable to update the EntitySet 'TblUsuarios' because it has a DefiningQuery and no <UpdateFunction> element exists in the <ModificationFunctionMapping> element to support the current operation.

    He probado de todo y no da...

    domingo, 4 de agosto de 2013 14:50
  • ese error lo da en _dt.SaveChanges
    domingo, 4 de agosto de 2013 14:50
  • hola

    pero esa tabla TblUsuarios como la estas mapeando a los datos, acaso defines algun procedure

    porque parece indicar que en el edmx no se puede determinar la accion de actualizacion, por eso indica que no hay una UpdateFunction y no soporta la operacion

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 4 de agosto de 2013 15:12
  • Realmente siento que mi confusion es grande.

    A ver si me pudes ayudar a clarificar algunas cosas o donde buscar y leer para poder clarificar mis ideas:

    Usaba en Windows Forms una consulta sql tipo datetable y luego un dataset y dataadapter para hacer todas las operaciones de editar y agregar registros a la BD.

    Ahora bien, en principio no quiero utilizar un CodeFirst pues ya tengo mis datos, ya tengo mi BD creada con historia y registros, etc.

    Linq es solo para consultas no se puede editar y agregar registros ?

    Cual es el sentido de usar un archivo ".edmx" ? (esto lo digo pues pense que al crear esto, ya creaba el codigo para algun procedure y por ende automatizara la gestion)

    Puedo mapaer la table mediante codigo y realizar las acciones de consulta, editar y agregar ?

    Estoy utilizando VB Profesional 2010, Asp.Net MVC 4 y quiero avanzar en los conocimientos, ponerlos en practica y quiero encaminarme en ese sentido, pero no tengo claro cual es el major camino. 

    domingo, 4 de agosto de 2013 17:25
  • en principio no quiero utilizar un CodeFirst pues ya tengo mis datos, ya tengo mi BD creada con historia y registros

    pero eso no tiene nada que ver puedes usar codefirst con uan db existente

    Code First to an Existing Database

    Linq es solo para consultas no se puede editar y agregar registros ?

    es verdad, si solo te refiers a linq solo aplica a colecciones, no  a una db

    Cual es el sentido de usar un archivo ".edmx" ?

    si usas EF database first este define un modelo visual de los datos, es en este archivo donde se realiza

    Puedo mapaer la table mediante codigo y realizar las acciones de consulta, editar y agregar ?

    si usas Code First puede mapear desde codigo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 4 de agosto de 2013 20:43
  • El linq a "Code First to an Existing Database" no funciona, pienso es problema del video.

    Ahora entiendo que se usa code first o EF, no ambos. Esto es asi ?

    Mi intencion es usar EF pero aun estoy confundido.

    Ahora cree el siguiente codigo y funciona perfectamente bien:

    Dim _dt as new GeneralEntities() (este es el nombre que le di a la entidad creada mediante el archivo .edmx)

    dim usu as int32 = cInt(Session("UsuId"))

    dim query = _dt.TblUsuarios.FirstOrDefault(Function(x) x.UsuId = usu And x.UsuCla = "")

    if query Is Nothing then

    mensaje....

    Return View(model)

    end if

    Ahora tendria que crear el codigo para grabar la nueva clave y entiendo me dices, debo crear un store procedure. Donde deberia crearlo, crear una clase aparte para esto ? Dentro del archivo ".edmx" solo tiene la table TblUsuarios.

    domingo, 4 de agosto de 2013 21:23
  • Ahora entiendo que se usa code first o EF, no ambos. Esto es asi ?

    codefirst es EF solo que tiene difernte modalidades de uso, puede ser database first o model first en donde usar un edmx o codefirst en donde defines todo desde codigo

    Ahora tendria que crear el codigo para grabar la nueva clave y entiendo me dices, debo crear un store procedure.

    si en edmx usas procedure para definir la mapping entonces si, sino no hace falta ya que EF crea las queries en runtime por eso es un orm

    El linq a "Code First to an Existing Database" no funciona, pienso es problema del video.

    a mi me funciona perfectamente, valida si tienes instalado silverlight

    sino, alli mismo tiene la explicacion del video, solo debes moverte por la pagina

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 4 de agosto de 2013 22:07
  • Disculpa tanta molestia Leandro pero en cuanto a lo que me dices:

    si en edmx usas procedure para definir la mapping entonces si, sino no hace falta ya que EF crea las queries en runtime por eso es un orm

    La unica forma que agrego el archivo ".edmx", es en el explorer selecciono agregar New Item, y agrego Ado.Net Entity Data Model, configuro la conexion a la bd, agrego la/s tablas y nada mas. Crea un nueva conexion en el web.config y no crea absolutamente mas nada. Mirando en el video, aparentemente crea las clases con el codigo correspondiente pero en mi caso no. Si abro el archivo solo contiene la/s tablas. Si abro el Model Browser, tiene las tablas y las carpetas que dicen Store Procedure y Constraints pero no tiene nada adentro.

    al colocar el siguiente codigo:

    query.UsuCla = clave

    _dt.SaveChanges() y aqui da el error que me comentabas es lo siguiente:

    "porque parece indicar que en el edmx no se puede determinar la accion de actualizacion, por eso indica que no hay una UpdateFunction y no soporta la operacion"

    Donde tengo que crear el codigo para que soporte la operacion de Update ?

    domingo, 4 de agosto de 2013 23:07
  • configuro la conexion a la bd, agrego la/s tablas y nada mas. Crea un nueva conexion en el web.config y no crea absolutamente mas nada

    ok, entonces es raro que antes no te dejo actualizar, porque si lo genera dinamico no deberia haber fallado

    aparentemente crea las clases con el codigo correspondiente pero en mi caso no

    ojo que el video no tiene nada que ver con un edmx, alli explica codefirst

    no lo compares con lo que estas realizando porque es otra forma de armar el mapping

    Donde tengo que crear el codigo para que soporte la operacion de Update ?

    es que no deberias crear ningun codigo, EF lo hace automatico por ti a las queries de UPDATE, por eso no me explico que podra ser

    si creas una nueva entidad y haces el SaveChange la crea? o sea realiza el INSERT

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 5 de agosto de 2013 0:00
  • Estoy tratando de ver por otro lado. La aplicación Asp.Net MVC 4 por defecto crea el controlador el modelo. Pero me da el siguiente error:

    You must call the "WebSecurity.InitializeDatabaseConnection" method before you call any other method of the "WebSecurity" class. This call should be placed in an _AppStart.cshtml file in the root of your site.

    Yo hice la configuración de la coneccion a la BD en el Web.config, pero parece habria que hacerla en otro lado pero no entiendo donde. Desde el Global.asax llama a 5 clases de configuración pero no entiendo donde deberia ir esa registración de la BD. La información de msdn es totalmente escueta.

    lunes, 5 de agosto de 2013 1:27
  • hola

    respondi en el foro de asp.net mvc

    http://social.msdn.microsoft.com/Forums/es-ES/02183b93-5ff0-4182-ba36-f091004147d4/inicializar-bd

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 5 de agosto de 2013 6:11
  • Al fin funciono correctamente. Opte por crear de 0 la aplicacion, pues con tanto "sube y baje" quizas hice algo que no correspondia y funciono tal cual debia funcionar correctamente. Gracias Leandro, voy a seguir avanzando.
    martes, 6 de agosto de 2013 22:53