代码第一个一对多,两个相同的实体

时间:2013-10-14 17:04:52

标签: c# entity-framework asp.net-mvc-4 entity-framework-5

请原谅我令人困惑的头衔,但简直说不容易。

我在代码第一个模型中定义多对多关系时遇到问题。 这是我使用代码第一个框架的第一个项目,我需要一些帮助。

我有两个模型,ItemTrade。而这背后的故事就是我建立一个物品交易网站。

交易涉及从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”。

非常感谢任何帮助,谢谢!

2 个答案:

答案 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表:

enter image description here

包含带有单个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));
}