我正在尝试实现一种仅在没有发生错误(“一切”)时将数据(实体对象)放入数据库的方法。如果发生错误,则不会在数据库中创建任何内容(“或什么都没有”)。我称之为“一切或一切”。
问题是我必须创建依赖于其他实体的实体。这是一个例子:
0) 我创建了一个上下文
DBContext ctx = new DBContext();
1) 我创建了一个 Invoice 实体对象并将其添加到上下文中:
Invoice inv1 = new Invoice();
inv1 .Number = "Invoice-2546432";
if(!ctx.Invoice.Exists(i => i.Number == "Invoice-2546432")) // problem n°1
ctx.AddObject(inv1 );
else
throws new Exception('blah blah');
2) 发票有发票行:
InvoiceLine line = new InvoiceLine();
line .ID_INVOICE = in1.ID; // problem n°2
line .Label = "Line 1";
line .Ammount = 5.3;
ctx.AddObject(line );
3)最后:
ctx.SaveChanges();
所以,如果一切顺利,我有这样的事情:
Table INVOICE
=====================
ID | NUMBER
_____________________
0 | Invoice-2454876
_____________________
1 | Invoice-2487432
_____________________
2 | Invoice-2546432
Table INVOICE_LINE
=========================================
ID | ID_INVOICE | LABEL | AMOUNT
_________________________________________
0 | 0 | Line 1 | 2.6
_________________________________________
1 | 0 | Line 2 | 7.6
_________________________________________
2 | 1 | Line 1 | 7.6
_________________________________________
3 | 2 | Line 1 | 8.6
_________________________________________
正如评论中提到的,有两个问题:
问题 1:
存在测试总是返回 false,因为它只在数据库中检查,而不是在我刚刚添加新对象的上下文本身中检查。
问题二:
因为发票只是添加到上下文中而不是在数据库中,所以我没有发票的未来 ID。所以我不能将它设置到发票行。
1)你知道如何做到这一点,基本上,一种将数据添加到数据库的安全方法吗?我正在开发一个财务应用程序,我想确保数据库中没有插入损坏的数据(例如:如果插入发票行失败,我希望不要将整个发票插入数据库)
2)我没有找到任何与那种东西相关的设计模式。你认识一个吗?
3)我不确定实体框架中的上下文对象是否很好理解:这是我的理解:
上下文(基本上)是与数据库的连接。当我添加一个实体时,它会保存在内存中的某个位置,并在我调用 SaveChanges() 后插入到数据库中。它是否正确 ?您知道任何详细介绍 ADO /entity 框架如何工作的网站或书籍吗?