c# - mvc - Entity framework 4.0 extraño con guardar datos
wpf c# ejemplos (2)
Me enfrenté con el siguiente problema. Tengo un almacén de datos con modelo
public class GameResult
{
public int GameResultId { get; set; }
public virtual Competition Competition { get; set; }
public virtual CustomDate DateGame { get; set; }
public virtual Contender ContenderFirst { get; set; }
public virtual Contender ContenderSecond { get; set; }
public virtual Location Location { get; set; }
}
public class Competition
{
[Key]
public int CompetitionId { get; set; }
public string Name { get; set; }
//Lazy loading
public virtual KindSport KindSport { get; set; }
}
Algo así genero algunos datos para la tabla de hechos GameResult
gameResult.Location = location;
gameResult.Competition = competition;
gameResult.ContenderFirst = firstContender;
gameResult.ContenderSecond = secondContender;
public void saveGameResult(GameResult gameResult)
{
using (var db = new GameContext())
{
db.GameResults.Add(gameResult);
db.SaveChanges();
}
}
Pero cuando trato de guardar datos, obtengo que no guarde la enity, de hecho, la tabla que guardan en cascadas también guardada en tablas secundarias como Location, Contender
.
¿Cómo puedo resolver mi problema?
debe cargar las entidades Location y Contender desde la base de datos. De lo contrario, se insertarán en él.
Add
marcas al gráfico completo del objeto como Added
.
Esta es una forma de solucionarlo:
public void saveGameResult(GameResult gameResult, .... more arguments ....)
{
using (var db = new GameContext())
{
db.GameResults.Add(gameResult);
gameResult.Location = location;
gameResult.Competition = competition;
gameResult.ContenderFirst = firstContender;
gameResult.ContenderSecond = secondContender;
db.SaveChanges();
}
}
Pero luego tienes que agregar más argumentos.
Una forma más tediosa es dejar todo tal como está y marcar cada dimensión como UnChanged
:
db.GameResults.Add(gameResult);
Entry(gameResult.Location).State = EntityState.Unchanged;
...
Otra forma es establecer solo los valores de Id
:
gameResult.LocationId = location.LocationId;
... etc.
public void saveGameResult(GameResult gameResult)
{
... (original code)
Pero, por supuesto, las propiedades Id primitivas deberían ser parte de la clase de hechos, formando asociaciones de claves foráneas .