请原谅我令人困惑的头衔,但简直说不容易。
我在代码第一个模型中定义多对多关系时遇到问题。 这是我使用代码第一个框架的第一个项目,我需要一些帮助。
我有两个模型,Item
和Trade
。而这背后的故事就是我建立一个物品交易网站。
交易涉及从A人发送给B人的一个或多个项目,并且一个或多个项目从B人发回给A人,完成交易。
一项仅属于一项交易,但一项交易可以有多项。
这就是我的模型到目前为止的样子。
物品
public class Item
{
public int ItemId { get; set; }
public string Name { get; set; }
public int TradeId { get; set; }
[ForeignKey("TradeId")]
public virtual Trade Trade { get; set; }
}
贸易
public class Trade
{
public int TradeId { get; set; }
public virtual ICollection<Item> ItemsToSend { get; set; }
public virtual ICollection<Item> ItemsToReturn { get; set; }
}
但是在尝试运行update-database
时,我收到以下错误。
System.Data.SqlClient.SqlException:INSERT语句与FOREIGN KEY约束“FK_dbo.Items_dbo.Trades_TradeId”冲突。冲突发生在数据库“MyDB”,表“dbo.Trades”,列“TradeId”。
非常感谢任何帮助,谢谢!
答案 0 :(得分:0)
我现在通过添加项目和交易的扁平结构来解决它。就像物品和行业中的多对多一样。
由于我知道每个项目的拥有者,我还可以通过在交易中添加senderId和returnerId来理清发送者和回归者。
这就是我的模型现在的样子。
<强>物品强>
public class Item
{
public int ItemId { get; set; }
public string Name { get; set; }
public virtual ICollection<Trade> Trades { get; set; }
}
<强>贸易强>
public class Trade
{
public int TradeId { get; set; }
public virtual UserProfile SendUser { get; set; }
public virtual UserProfile ReturnUser { get; set; }
public virtual ICollection<Item> Items { get; set; }
}
现在适用..
答案 1 :(得分:0)
这:“一个项目只属于一个交易,但一个交易可以有很多项目。”听起来像一对多?
如果没有Item to Trade的反向引用,那么映射会更加简单。
此模型将在没有任何配置的情况下进行映射:
public class Trade
{
public int Id { get; set; }
public virtual ICollection<Item> ItemsToSend { get; set; }
public virtual ICollection<Item> ItemsToReturn { get; set; }
}
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
}
使用此代码插入数据:
var trade = new Trade
{
ItemsToReturn = new [] { new Item{ Name = "Item to return 1"}, new Item{ Name = "Item to return 2"}},
ItemsToSend = new [] { new Item{ Name = "Item to send 1"}, new Item{ Name = "Item to send 2"} }
};
context.Trades.Add(trade);
context.SaveChanges();
将生成一个如下所示的Item表:
包含带有单个Id列的单行的Trades表。
如果您需要从项目导航到它所属的交易,您可以执行查询。
例如,要获得ID = 3的项目所属的交易,您可以这样做:
using (var db = new TradingContext())
{
var tradeOfItem3 = db.Trades.
FirstOrDefault(t => t.ItemsToReturn.Any(i => i.Id == 3) || t.ItemsToSend.Any(i => i.Id == 3));
}