繁体   English   中英

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

[英]Updating table fields not included in model Linq to Entities

因此,我想称其为“对实体进行Linq审核”或类似内容,但意识到并没有完全封装我想做的事情。 简而言之,我们的数据建模师需要在应用程序内的每个表上甚至是交叉引用表(代表多对多关系中间的表)上放置4列

无论如何,我已经阅读了大量有关变更跟踪的文章,这与我想做的事情很接近,但不完全正确。 我想要做的是重写TSQL生成,以添加模型中未包含的我需要更新的列。

编辑

考虑更多有关此问题的知识,我意识到我的示例还不够完善...想象用户<--->角色关系以及它如何工作。 通常,您创建3个表:[用户],[角色]和[用户角色],其中有2列用于将许多用户引用到许多角色。

现在,想象一下对于所有三个表,您热爱的DBA添加了4列:CreatedBy,CreatedOn,UpdatedBy和UpdatedOn。

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

public class User
{
    public int Id { get; set;}
    public string Username { get; set;}
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Password { get; set; }
    public List<Role> Roles { get; set; }
}

public class Role
{
    public int Id {get; set; }
    public string Code { get; set; }
    public string Description { get; set; }
}

没有人能够成功地更新所有更新和创建的列,而无需使用实体框架将这些字段添加到其模型中;如果这样,他们是否可以提供此示例?

同样的问题,但对于NHibernate。 如果NHibernate将支持此功能,但是Entity Framework不支持,那么我很乐于说服允许我们在Entity Framework上使用NHibernate的功能,因为我对此有充分的理由。

我有一个非常相似的结构。 更新字段的唯一方法是将它们作为属性添加到对象(我将它们封装在AuditInfo类中)或使用触发器。 在我的应用程序中向用户显示了审核字段,因此无论如何我都必须将它们用作属性。 NHibernate具有很强的可扩展性,您可以完成您提出的建议,但这很难看。

在我的情况下,触发器还不够,因为我们的应用程序具有自己的用户管理,因此我必须在应用程序中设置xBy属性。 我们还将触发器作为备份并记录在应用程序外部所做的更改(数据清理)。

多对多表提出了一个大问题,因为我必须将它们包括在域模型中才能设置审核字段。 我不这样做,因此对于那些表,我在触发器中仅具有可用的审核信息(即除实际用户名之外的所有内容)。

AuditInfo类:

[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; }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM