簡體   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