Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将模型Linq中未包含的表字段更新为实体_C#_Entity Framework_Nhibernate_Audit - Fatal编程技术网

C# 将模型Linq中未包含的表字段更新为实体

C# 将模型Linq中未包含的表字段更新为实体,c#,entity-framework,nhibernate,audit,C#,Entity Framework,Nhibernate,Audit,所以,我想把它叫做“审计Linq到实体”或类似的东西,但我意识到这并不能完全概括我想要做的事情。简单地说,我们的数据建模师需要在应用程序中的每个表上放置4列,甚至是交叉引用表(表示多对多关系中间的表) 无论如何,我已经读了很多关于变更跟踪的文章,这些文章接近我想要做的,但并不确切。我希望做的是覆盖TSQL生成,以附加我需要更新的、不包含在模型中的列 编辑 仔细思考这个问题,我意识到我的例子并不完整。。。想象一下用户角色关系及其工作原理。通常创建3个表:[Users]、[Roles]和[UserR

所以,我想把它叫做“审计Linq到实体”或类似的东西,但我意识到这并不能完全概括我想要做的事情。简单地说,我们的数据建模师需要在应用程序中的每个表上放置4列,甚至是交叉引用表(表示多对多关系中间的表)

无论如何,我已经读了很多关于变更跟踪的文章,这些文章接近我想要做的,但并不确切。我希望做的是覆盖TSQL生成,以附加我需要更新的、不包含在模型中的列

编辑 仔细思考这个问题,我意识到我的例子并不完整。。。想象一下用户角色关系及其工作原理。通常创建3个表:[Users]、[Roles]和[UserRoles],其中有两列用于将多个用户引用到多个角色

现在,想象一下,对于这三个表,您喜爱的DBA添加了4列:CreatedBy、CreatedOn、UpdatedBy、UpdatedOn

在代码中,您可能有一个针对每个用户的角色集合(列表、集合、堆栈等),如下C#代码所示:

公共类用户
{
公共int Id{get;set;}
公共字符串用户名{get;set;}
公共字符串名{get;set;}
公共字符串Lastname{get;set;}
公共字符串密码{get;set;}
公共列表角色{get;set;}
}
公共阶级角色
{
公共int Id{get;set;}
公共字符串代码{get;set;}
公共字符串说明{get;set;}
}

是否有人能够成功地更新所有更新和创建的列,而不使用实体框架将这些字段添加到他们的模型中,如果是,他们能否提供这方面的示例


同样的问题,但对NHibernate来说。如果NHibernate会支持这一点,但实体框架不会,我很乐意说服权力允许我们在实体框架之上使用NHibernate,因为我有一个合理的理由。

我有一个非常类似的结构。更新字段的唯一方法是将它们作为属性添加到对象中(我将它们封装在AuditInfo类中)或使用触发器。在我的应用程序中向用户显示审核字段,因此我必须将它们作为属性提供。NHibernate是如此的可扩展,以至于你可以完成你的提议,但这将是丑陋的

在我的例子中,触发器是不够的,因为我们的应用程序有自己的用户管理,所以我必须在应用程序中设置xBy属性。我们还准备了触发器作为备份,并记录在应用程序(数据scrubs)之外所做的更改

多对多表带来了一个大问题,因为为了设置审计字段,我必须将它们包括在域模型中。我没有这样做,所以对于那些表,我只有触发器中可用的审计信息(即除了实际用户名以外的所有信息)

试听信息类:

[Serializable]
public sealed class AuditInfo
{
    public AuditInfo()
    {
        SetCreated(string.Empty, DateTime.Now);
    }

    public string CreatedBy { get; private set; }
    public DateTime CreatedDate { get; private set; }
    public string RevisedBy { get; private set; }
    public DateTime RevisedDate { get; private set; }

    public string CreatedInfo
    {
        get { return "Created: " + CreatedDate.ToShortDateString() + " by " + CreatedBy; }
    }

    public string RevisedInfo
    {
        get { return "Revised: " + RevisedDate.ToShortDateString() + " by " + RevisedBy; }
    }

    internal void SetCreated(string createdBy, DateTime createdDate)
    {
        CreatedBy = createdBy;
        CreatedDate = createdDate;
        SetRevised(createdBy, createdDate);
    }

    internal void SetRevised(string revisedBy, DateTime revisedDate)
    {
        RevisedBy = revisedBy;
        RevisedDate = revisedDate;
    }
}
可审核实体实现的接口:

public interface IAuditable
{
    AuditInfo AuditInfo { get; }
}

这是一种方式,但我受到公司政策的限制,我们必须准确地更新4个专栏,即使是多对多,我们和你处于同一条船上。。。我们的应用程序都使用域登录登录到SQL Server,而不是从Active Directory中的每个用户传递WinAuth凭据,因此必须有一种方法来利用应用程序中的“用户”,而不是连接。
public interface IAuditable
{
    AuditInfo AuditInfo { get; }
}