首页 \ 问答 \ 将实体框架保存在单个实体类型上(Extend Entity Framework Save on a single Entity Type)

将实体框架保存在单个实体类型上(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
更新时间:2022-02-16 06:02

最满意答案

更换

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 ...
  • 您可以定义错误捕获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 ...

相关文章

更多

最新问答

更多
  • python的访问器方法有哪些
  • 使用Zend Framework 2中的JOIN sql检索数据(Retrieve data using JOIN sql in Zend Framework 2)
  • 透明度错误IE11(Transparency bug IE11)
  • linux的基本操作命令。。。
  • 响应navi重叠h1和nav上的h1链接不起作用(Responsive navi overlaps h1 and navi links on h1 isn't working)
  • 在C中读取文件:“r”和“a +”标志的不同行为(Reading a File in C: different behavior for “r” and “a+” flags)
  • NFC提供什么样的带宽?(What Kind of Bandwidth does NFC Provide?)
  • 元素上的盒子阴影行为(box-shadow behaviour on elements)
  • Laravel检查是否存在记录(Laravel Checking If a Record Exists)
  • 设置base64图像的大小javascript - angularjs(set size of a base64 image javascript - angularjs)
  • 想学Linux 运维 深圳有哪个培训机构好一点
  • 为什么有时不需要在lambda中捕获一个常量变量?(Why is a const variable sometimes not required to be captured in a lambda?)
  • 在Framework 3.5中使用服务器标签<%=%>设置Visible属性(Set Visible property with server tag <%= %> in Framework 3.5)
  • AdoNetAppender中的log4net连接类型无效(log4net connection type invalid in AdoNetAppender)
  • 错误:发送后无法设置标题。(Error: Can't set headers after they are sent. authentication system)
  • 等待EC2实例重启(Wait for an EC2 instance to reboot)
  • 如何在红宝石中使用正则表达式?(How to do this in regex in ruby?)
  • 使用鼠标在OpenGL GLUT中绘制多边形(Draw a polygon in OpenGL GLUT with mouse)
  • 江民杀毒软件的KSysnon.sys模块是什么东西?
  • 处理器在传递到add_xpath()或add_value()时调用了什么顺序?(What order are processors called when passed into add_xpath() or add_value()?)
  • sp_updatestats是否导致SQL Server 2005中无法访问表?(Does sp_updatestats cause tables to be inaccessible in SQL Server 2005?)
  • 如何创建一个可以与持续运行的服务交互的CLI,类似于MySQL的shell?(How to create a CLI that can interact with a continuously running service, similar to MySQL's shell?)
  • AESGCM解密失败的MAC(AESGCM decryption failing with MAC)
  • SQL查询,其中字段不包含$ x(SQL Query Where Field DOES NOT Contain $x)
  • PerSession与PerCall(PerSession vs. PerCall)
  • C#:有两个构造函数的对象:如何限制哪些属性设置在一起?(C#: Object having two constructors: how to limit which properties are set together?)
  • 平衡一个精灵(Balancing a sprite)
  • n2cms Asp.net在“文件”菜单上给出错误(文件管理器)(n2cms Asp.net give error on Files menu (File Manager))
  • Zurb Foundation 4 - 嵌套网格对齐问题(Zurb Foundation 4 - Nested grid alignment issues)
  • 湖北京山哪里有修平板计算机的