我使用的是带有EF Code First的POCO类。
我有一个类球作为:
public class Ball
{
[Key]
public int BallId { get; set; }
public Box Container { get; set; }
[Required]
public bool IsCounted{get; set;}
}
和一个类框作为:
public class Box
{
[Key]
public int BoxId { get; set; }
[Required]
public string Description { get; set; }
public ICollection<Ball> Balls { get; set; }
}
我有一个已经创建的球的列表,我希望用它创建一个新的盒子!创建方框时:
- 每个球的IsCounted属性都应该为true
- 盒子。球引用应指向现有对象
球。容器应该指向新的盒子!
public void CreateBox(string Description, ICollection<Ball> givenBalls) { using (var c = new BoxEntryModel()) { Box entry = new Box(); if (c.Boxes.Count().Equals(0)) entry.BoxId = 1; else entry.BoxId = c.Boxes.Max<Box>(b => b.BoxId) + 1; entry.Description = Description; entry.Balls = givenBalls; try { foreach (Ball ball in givenBalls) { c.Balls.Attach(ball); ball.IsCounted = true; ball.Container = entry; } c.Boxes.Add(entry); c.SaveChanges(); } }
这段代码给了我一个例外:
存储更新、插入或删除语句影响了意外的行数(0)。自加载实体以来,实体可能已被修改或删除。刷新ObjectStateManager条目。描述:在执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误以及错误在代码中的来源的更多信息。
异常详细信息:System.Data.OptimisticConcurrentException:存储更新、插入或删除语句影响了意外的行数(0)。自加载实体以来,实体可能已被修改或删除。刷新ObjectStateManager条目。
此外,如果我评论行c.Balls.Attach(费用) 代码是有效的,但它为我试图添加到框中的每个球创建了新行
请帮助我根据关系保存实体。提前谢谢。
从您放在这里的代码来看,您似乎实际上没有在EF中正确设置Balls和Box之间的FK。EF可能会感到困惑,为什么你在没有任何编辑的情况下附上球(至少根据EF的说法)。尝试在您的Box代码中设置以下内容:
public class Ball
{
[Key]
public int BallId { get; set; }
[ForeignKey("Container")]
public int BoxID { get; set; }
public Box Container { get; set; }
[Required]
public bool IsCounted{get; set;}
}
如果不起作用,请检查givenBalls(c.Entry(ball).State
)中每个球的EntityState,并查看它们是否已分离。
让我知道这是怎么回事。