Sto "giocando" un po' con LinQ, ma non riesco a fare una cosa come vorrei:

ho una relazione "1 a molti", da un parte una classe "utenti" e dall'altra una "comunicazioni" (messaggi da inviare ai singoli utenti), dal punto di vista relazionale ho una tabella utenti e una tablela comunicazioni che ha una chiave esterna "IdUtente" che identifica l'utente al quale è rviolta la comunicazione

le classi sono fatte così: (ho escluso proprietà non rilevanti)

Utente
[Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "int NOT NULL IDENTITY")]
public int Id { get; set; }
[Column]
public string Nome { get; set; }
private EntitySet<Comunicazione> _Comunicazioni = new EntitySet<Comunicazione>();
[Association(Name = "UtCom", Storage = "_Comunicazioni", OtherKey = "_IdUtente", DeleteOnNull = false)]
public EntitySet<Comunicazione> Comunicazioni
{
get { return this._Comunicazioni; }
set { this._Comunicazioni.Assign(value); }
}

ed ecco Comunicazione
[Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "int NOT NULL IDENTITY")]
public int Id { get; set; }
[Column]
public string Messaggio{ get; set; }
[Column(Name = "IdUtente")]
private int _IdUtente;
private EntityRef<Utente> _utenteRef = new EntityRef<Utente>();
[Association(Name = "UtCom", Storage = "_utenteRef", ThisKey = "_IdUtente", IsForeignKey = true, DeleteOnNull = false)]
public Utente utente
  {
    get { return this._utenteRef.Entity; }
    set { this._utenteRef.Entity = value; }
}

La classe "comunicazione" funziona a meraviglia, cioè se faccio:
mydc bdt = new mydc();
Utente ut = bdt.Utenti.Single(u => (u.Id == _userId));
Comunicazione com = new Comunicazione { 
Messaggio = "MESSAGGIO"; 
utente = ut
}
bdt.Comunicazioni.InsertOnSubmit(com);
bdt.SubmitChanges();


la riga nella tabella "comunicazione" viene creata e la chiave esterna correttamente impostata

MENTRE se faccio

mydc bdt = new mydc();
Utente ut = bdt.Utenti.Single(u => (u.Id == _userId));
Comunicazione com = new Comunicazione { 
Messaggio = "MESSAGGIO"
}
ut.Comunicazioni.Add(com);
bdt.SubmitChanges();

la riga viene creata MA la chiave esterna viene impostata a "0" e non con l'id dell'utente....

DOVE SBAGLIO? (lo so che funziona cmq ma è per capire)

Grazie in anticipo
Ciao,

su
[Association(Name = "UtCom", Storage = "_Comunicazioni", OtherKey = "_IdUtente", DeleteOnNull = false)]

così ad occhio mi pare manchi ThisKey="Id".

Prova a reimpostare la relazione dal designer.

m.
Provato adesso....non funzia...la chiave esterna mi viene sempre impostata con il valore "0"
qualche idea?
m.alberti ha scritto:
mydc bdt = new mydc();
Utente ut = bdt.Utenti.Single(u => (u.Id == _userId));
Comunicazione com = new Comunicazione {
Messaggio = "MESSAGGIO"
}
ut.Comunicazioni.Add(com);
bdt.SubmitChanges();
Utilizzi il costruttore della classe Comunicazione passando solo la proprietà Messaggio e non l'IdUtente FK
Comunicazione com = new Comunicazione {  
Messaggio = "MESSAGGIO",utente = ut.Id 
}  
ut.Comunicazioni.Add(com); 

Fabrizio Canevali
scusa, ma a parte il fatto che utente = ut.Id non ha senso
(uno è un intero e l'altro una classe)

anche aggiungere

Comunicazione com = new Comunicazione {
Messaggio = "MESSAGGIO",
utente = ut
}
ut.Comunicazioni.Add(com); 


mi sembra una ripetizione, la chiave esterna dovrebbe essere
dedotta al momento dell'inserimento nella lista delle comunicazioni
dell'utente selezionato...
LinqToSql nel TuoDb.designer.cs mostra l'oggetto <Utente> per "mappare" il domain ma in realtà nella tabella Comunicazioni hai una FK di tipo integer (Idutente?), che devi passare al costruttore per l'integrità referenziale.

Fabrizio Canevali
Ciao,

scusami ma ancora non ho capito se hai realizzato le entity tramite il designer o le hai scritte a mano, perchè ad esempio nel codice che posti mancano alcuni attributi, come OtherKey su Comunicazione.Utente (oltre quella che ti ho segnalato prima).

In condizioni normali, infatti, LINQ to Sql si prende carico di valorizzare automaticamente la proprietà Comunicazione.Utente nel momento in cui aggiungi una comunicazione alla collection del Master.

Ti invito pertanto a verificare nuovamente il codice delle tue entity ed eventualmente di rigenerare la relazione dal designer.

m.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.