将实体框架保存在单个实体类型上(Extend Entity Framework Save on a single Entity Type)
我有一个相当大的保存例程,使用Entity Framework更新数百个项目,然后一次保存整个项目。
using (var dc = new EntityLayer.Entities()) { dc.Entity1.Prop1 = 1; dc.Entity1.Prop2 = 2; dc.Entity2.Prop1 = 1; dc.Entity2.Prop2 = 2; // Audit item dc.Entity2.Prop3 = 3; // Audit item dc.Entity3.Prop1 = 1; ... dc.SaveChanges(); }
我希望能够做的是以某种方式扩展Save for a Individual Entity或者接受这个改变并启动另一种方法。
这样做的主要目的是挂钩我们的审计系统,审计系统只审计一些关键项目(例如上面简化版本中的Entity2.Prop2和Entity2.Prop3),但也可能启动一些其他例程,创建任务等等,但关键是 - 能做到吗?
基本上我打算删除我们必须为特定类型添加的额外审计线,如下所示:
using (var dc = new EntityLayer.Entities()) { dc.Entity1.Prop1 = 1; dc.Entity1.Prop2 = 2; dc.Entity2.Prop1 = 1; dc.Entity2.Prop2 = 2; dc.Audit.CreateObject() { Type = "Entity2", Change = "Prop2", From = oldVal, To = 2} dc.Entity2.Prop3 = 3; dc.Audit.CreateObject() { Type = "Entity2", Change = "Prop3", From = oldVal, To = 3} ... dc.SaveChanges(); }
I have a rather large save routine that updates hundreds of items using the Entity Framework and then saves the whole lot in one go.
using (var dc = new EntityLayer.Entities()) { dc.Entity1.Prop1 = 1; dc.Entity1.Prop2 = 2; dc.Entity2.Prop1 = 1; dc.Entity2.Prop2 = 2; // Audit item dc.Entity2.Prop3 = 3; // Audit item dc.Entity3.Prop1 = 1; ... dc.SaveChanges(); }
What I would love to be able to do is somehow either extend the Save for an individual Entity or pick up on this change and kick off another method.
The main purpose of this is to hook into our Audit system, which only audits some key items, (so for example only Entity2.Prop2 and Entity2.Prop3 in the simplified version above) but would also possibly kick off some other routines, creating tasks etc, but the crux is - can it be done?
Basically I'm aiming to remove the extra audit line we have to put in for specific types as below:
using (var dc = new EntityLayer.Entities()) { dc.Entity1.Prop1 = 1; dc.Entity1.Prop2 = 2; dc.Entity2.Prop1 = 1; dc.Entity2.Prop2 = 2; dc.Audit.CreateObject() { Type = "Entity2", Change = "Prop2", From = oldVal, To = 2} dc.Entity2.Prop3 = 3; dc.Audit.CreateObject() { Type = "Entity2", Change = "Prop3", From = oldVal, To = 3} ... dc.SaveChanges(); }
原文:https://stackoverflow.com/questions/6029048
最满意答案
更换
args = parser.parse_args()
同
args, unknown = parser.parse_known_args()
例如,
import argparse parser = argparse.ArgumentParser() parser.add_argument('--foo') args, unknown = parser.parse_known_args(['--foo', 'BAR', 'spam']) print(args) # Namespace(foo='BAR') print(unknown) # ['spam']
Replace
args = parser.parse_args()
with
args, unknown = parser.parse_known_args()
For example,
import argparse parser = argparse.ArgumentParser() parser.add_argument('--foo') args, unknown = parser.parse_known_args(['--foo', 'BAR', 'spam']) print(args) # Namespace(foo='BAR') print(unknown) # ['spam']
相关问答
更多-
你得到的错误是因为-u在它后面期待着一些值。 如果您使用python script.py -h您会在使用说明中找到[-u UPGRADE] 。 如果要将其用作布尔或标志(如果使用了-u则为true),请添加其他参数action : parser.add_argument("-u","--upgrade", help="fully automatized upgrade", action="store_true") action - 在命令行中遇到此参数时要采取的基本操作类型 使用action="store ...
-
是的,您可以将help选项设置为add_argument到argparse.SUPPRESS 。 这是argparse文档中的一个例子: >>> parser = argparse.ArgumentParser(prog='frobble') >>> parser.add_argument('--foo', help=argparse.SUPPRESS) >>> parser.print_help() usage: frobble [-h] optional arguments: -h, --help ...
-
将所有命令放在子分析程序中 parser = argparse.ArgumentParser() sub_parser = parser.add_subparsers(dest='cmd') parser_a = sub_parser.add_parser('a') parser_a.add_argument("a", choices = ["1", "2"]) parser_b = sub_parser.add_parser('b') parser_c = sub_parser.add_parser('c ...
-
如何捕获导致argparse在Python中引发错误的值(How to catch the value that cause argparse to raise an error in Python)[2022-06-18]
您可以定义错误捕获type功能。 例如,将int包装为: def trytype(astr, fn=int): try: ret = fn(astr) except ValueError: ret = ('error', astr) return ret In [51]: parser = argparse.ArgumentParser() In [52]: parser.add_argument('-f', type=trytype); In [ ... -
更换 args = parser.parse_args() 同 args, unknown = parser.parse_known_args() 例如, import argparse parser = argparse.ArgumentParser() parser.add_argument('--foo') args, unknown = parser.parse_known_args(['--foo', 'BAR', 'spam']) print(args) # Namespace(foo='B ...
-
要添加一个可选的--dry-run参数,您可以使用以下代码片段: parser.add_argument('--dry-run', action='store_true') 使用python my_script.py csv_name.csv --dry-run调用脚本python my_script.py csv_name.csv --dry-run将导致args.dry_run为True 。 不放这个选项会导致它成为False To add an optional --dry-run argument ...
-
在我看来,这只是一个错字。 在第26行del_list而不是del_List。 #!/usr/bin/python import argparse import re import string p = argparse.ArgumentParser() p.add_argument('-a', '--add', help="input the data in format ip:port:name", nargs='*') p.add_argument('-d', '--delete', help=" ...
-
这不是一个argparse问题。 这是一个shell问题。 你的shell解析出参数并将这些参数作为数组传递给Python。 告诉shell不要通过在构成一个参数的那些部分周围加上引号来解析字符串: $ python test.py -s 90030#95000#m#6099#bc 90031#95001#s#1#+100ABC \ 90032#95002#s#2#+200ABC "90033#95003#s#3#+300 ABC" 注意"90033#95003#s#3#+300 ABC"作为最后 ...
-
from b import foo大致相当于以下内容: import b foo = b.foo del b 虽然它“只导入foo ”,但它仍然运行b.py顶层的所有语句(这对foo是必要的),包括对parse.parse_args()的调用。 此调用将打印帮助文本并完全忽略a.py的argparse调用,因为尚未发生这些调用。 如果您希望模块能够添加参数,则需要将ArgumentParser的创建与对parse_args的调用parse_args 。 例如,您可以拥有一个单独的args模块: # fil ...
-
我怀疑是不可能让argparse本地做这件事。 您可以预先处理sys.argv ,作为非侵入性的解决方法。 import sys from argparse import ArgumentParser from uuid import uuid4 sentinel = uuid4().hex def preprocess(argv): return [sentinel if arg == '--' else arg for arg in argv[1:]] def postprocess(ar ...