如何解决孩子们不会更新Xamarin SQLite扩展-ManyToMany关系
我有四个具有属性的表(成员具有玩家,每个成员都参与许多体育运动)最后一个表用于多对多关系的中间表
[Table("Members")]
public class MemberModel : BaseDatabaseItem
{
public string MemberShipCode { get; set; }
public string MemberShipYear { get; set; }
[OnetoMany(CascadeOperations = CascadeOperation.All)]
public List<PlayerModel> MembershipNPlayers { get; set; }
}
[Table("Players")]
public class PlayerModel : BaseDatabaseItem
{
public string PlayerName { get; set; }
public double PlayerPayment { get; set; }
[ForeignKey(typeof(MemberModel))]
public int MemberModelId { get; set; }
[ManyToMany(typeof(PlayerSport))]
public List<Sport> Sports { get; set; }
}
[Table("Sports")]
public class Sport : BaseDatabaseItem
{
private SportCaegory sportCaegory;
public string SportName { get; set; }
[Ignore]
public SportCaegory SportCaegory
{
get
{
return sportCaegory = new SportCaegory
{
SportPrice = SportPrice,SportType = SportType
};
}
set
{
sportCaegory = value;
if (sportCaegory == null)
return;
SportType = sportCaegory.SportType;
SportPrice = sportCaegory.SportPrice;
}
}
public string SportType { get; set; }
public double SportPrice { get; set; }
[ManyToMany(typeof(PlayerSport))]
public List<PlayerModel> Players { get; set; }
}
public class PlayerSport : BaseDatabaseItem
{
[ForeignKey(typeof(PlayerModel))]
public int PlayerModelId { get; set; }
[ForeignKey(typeof(Sport))]
public int SportId { get; set; }
}
BaseDataItem只是具有ID(主要-AutoIn)的类
将会员保存在数据库中时,我先保存Sports然后再保存Players,最后保存该会员
foreach (var sport in Players.SelectMany(p => p.Sports))
{
await _sportsRepository.SaveItemAsync(new Sport
{
Id = sport.Id == 0 ? 0 : sport.Id,SportName = sport.SportName,SportCaegory = sport.SportCaegory
});
};
foreach (var player in Players)
{
await _playersRepository.SaveItemAsync(new PlayerModel
{
Id = player.Id == 0 ? 0 : player.Id,PlayerName = player.PlayerName,PlayerPayment = player.PlayerPayment,Sports = player.Sports
});
await _playersRepository.SaveWithChildrenAsync(player);
};
var member = new MemberModel
{
Id = string.IsNullOrEmpty(Id) ? 0 : int.Parse(Id),MemberShipCode = MemberShipCode,MemberShipYear = MemberShipYear,MembershipNPlayers = Players.ToList()
};
await _membersRepository.SaveWithChildrenAsync(member);
SaveWithChildrenAsync(仅检查ID)=>
public async Task SaveWithChildrenAsync(T entity)
{
if (entity.Id != 0)
await UpdateWithChildren(entity);
else
await InsertWithChildren(entity);
}
当我检索数据时,每个运动员的体育项目列表计数始终等于零
var member = await _membersRepository.GetWithChildren(MemberId) ;
var MemberPlayers = member.MembershipNPlayers;
foreach (var player in MemberPlayers)
{
var p = await _playersRepository.GetWithChildren(player.Id);
Players.Add(p);
}
MemberShipCode = member.MemberShipCode;
MemberShipYear = member.MemberShipYear;
如何解决?
解决方法
由于您未提供代码的某些部分,因此我编写了一个简单的代码来更新数据库并接收数据。您可以检查下面的代码。
模型类:
[Table("Members")]
public class MemberModel : BaseDatabaseItem
{
public string MemberShipCode { get; set; }
public string MemberShipYear { get; set; }
[OneToMany(CascadeOperations = CascadeOperation.All)]
public List<PlayerModel> MembershipNPlayers { get; set; }
}
public class BaseDatabaseItem
{
[PrimaryKey,AutoIncrement]
public int Id { get; set; }
}
[Table("Players")]
public class PlayerModel : BaseDatabaseItem
{
public string PlayerName { get; set; }
public double PlayerPayment { get; set; }
[ForeignKey(typeof(MemberModel))]
public int MemberModelId { get; set; }
[ManyToMany(typeof(PlayerSport))]
public List<Sport> Sports { get; set; }
}
[Table("Sports")]
public class Sport : BaseDatabaseItem
{
private SportCaegory sportCaegory;
public string SportName { get; set; }
[Ignore]
public SportCaegory SportCaegory
{
get
{
return sportCaegory = new SportCaegory
{
SportPrice = SportPrice,SportType = SportType
};
}
set
{
sportCaegory = value;
if (sportCaegory == null)
return;
SportType = sportCaegory.SportType;
SportPrice = sportCaegory.SportPrice;
}
}
public string SportType { get; set; }
public double SportPrice { get; set; }
[ManyToMany(typeof(PlayerSport))]
public List<PlayerModel> Players { get; set; }
}
public class SportCaegory
{
public string SportType { get; set; }
public double SportPrice { get; set; }
}
public class PlayerSport : BaseDatabaseItem
{
[ForeignKey(typeof(PlayerModel))]
public int PlayerModelId { get; set; }
[ForeignKey(typeof(Sport))]
public int SportId { get; set; }
}
插入和读取数据:
var dbName = "CustomersDb.db3";
var path = Path.Combine(System.Environment.
GetFolderPath(System.Environment.
SpecialFolder.Personal),dbName);
var db = new SQLiteConnection(path);
db.CreateTable<MemberModel>();
db.CreateTable<PlayerModel>();
db.CreateTable<PlayerSport>();
db.CreateTable<Sport>();
var Member1 = new MemberModel()
{
MemberShipCode = "A",MemberShipYear = "111"
};
var Player1 = new PlayerModel()
{
MemberModelId = 12,PlayerName = "B",PlayerPayment = 1.2,};
var SportPlayer1 = new PlayerSport()
{
PlayerModelId = 1,SportId = 2
};
var Sport1 = new Sport()
{
SportCaegory = new SportCaegory()
{
SportPrice = 12,SportType = "tY"
},SportName = "Name1",SportPrice = 13,SportType = "ww"
};
db.Insert(Member1);
db.Insert(Player1);
db.Insert(Sport1);
db.Insert(SportPlayer1);
Member1.MembershipNPlayers = new List<PlayerModel> { Player1 };
Player1.Sports = new List<Sport> { Sport1 };
Sport1.Players = new List<PlayerModel>() { Player1 };
db.UpdateWithChildren(Member1);
db.UpdateWithChildren(Sport1);
db.UpdateWithChildren(Player1);
var M = db.GetWithChildren<MemberModel>(Member1.Id);
var P = db.GetWithChildren<PlayerModel>(Player1.Id);
截屏:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。