2009-04-10 13 views
20

que he estado tratando de insertar una fila en la tabla que tiene una columna de identidad RequestID (que es clave primaria también)No se puede realizar de creación, actualización o supresión en la tabla, ya que no tiene clave primaria

HelpdeskLog logEntry = new HelpdeskLog { RequestBody = message.Body }; 
    if (attachment != null) 
     logEntry.Attachments = Helper.StreamToByteArray(attachment.ContentStream); 
    Database.HelpdeskLogs.InsertOnSubmit(logEntry); 

Pero mi código produce inevitablemente siguiente error

no se puede realizar de creación, actualización o supresión en la tabla, ya que no tiene clave primaria.

pesar de columna de clave principal existe de hecho

Eso es lo que he intentado hacer:

  1. que mirar en depurador el valor de columna de identidad que se inserta en el modelo de objetos. Es 0
  2. Para insertar valores falsos manualmente (con SQL) en la tabla - funciona bien, los valores de identidad se generaron como se esperaba
  3. Para asegurar si SQLMetal ha generado correctamente el mapa de tablas. Todo bien, el atributo de clave principal se genera correctamente

Sin embargo, ninguno de los enfoques ayudó. ¿Cuál es el truco? ¿Alguien sabe?

Respuesta

3

Como la tabla tiene la clave principal en SQL Server, vuelva a agregar la tabla en el diseñador linq2sql.

Si ese no fuera el caso, puede configurar qué propiedades son parte de la clave principal a mano en el diseñador.

4

Elimine la tabla y vuelva a insertarla. Debe asegurarse de que haya una pequeña tecla pequeña al lado del campo antes de hacer esto. Recompile su proyecto y todo debería estar bien.

El hecho de que haya actualizado el dabase no significa que el archivo DBML se haya actualizado de alguna manera automáticamente. No lo hace, lo siento.

29

que he también tenía este problema surgido en mi código C#, y se dio cuenta de que me había olvidado la designación IsPrimaryKey:

[Table (Name = "MySessionEntries")] 
    public class SessionEntry 
    { 
    [Column(IsPrimaryKey=true)] // <---- like this 
    public Guid SessionId { get; set; } 
    [Column] 
    public Guid UserId { get; set; } 
    [Column] 
    public DateTime Created { get; set; } 
    [Column] 
    public DateTime LastAccess { get; set; } 
    } 

esto es necesario, incluso si su tabla de base de datos (MySessionEntries, en este caso) ya tiene definida una clave principal, ya que Linq no encuentra automágicamente ese hecho a menos que haya utilizado las herramientas linq2sql para llevar sus definiciones de base de datos a Visual Studio.

+2

¡Gracias! Mi código se veía un poco diferente, pero el principal era el mismo '[global :: System.Data.Linq.Mapping.ColumnAttribute (Storage =" _ID ", DbType =" UniqueIdentifier NOT NULL ", IsPrimaryKey = true)]' hizo el truco. –

Cuestiones relacionadas